2016-05-01 12 views
1

Hier ist die Ansicht, die ich schreiben werde:Modell Bindung für komplexes Objekt nicht funktioniert

@model WelcomeViewModel 
@using (Html.BeginForm("SignUp", "Member", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post)) 
{ 

    .... 
    <div class="form-group"> 
     @Html.EditorFor(model => model.SignUp.CompanyName, new {htmlAttributes = new {@class = "form-control" }}) 
    </div> 
    <div class="form-group"> 
     @Html.EditorFor(model => model.SignUp.RegisteredNo, new {htmlAttributes = new {@class = "form-control" } }) 
    </div> 
    .... 
    <button type="submit" name="signup" class="btn">Register</button> 
} 

Ansichtsmodell:

public class WelcomeViewModel 
{ 
    public SignInViewModel LogOn { get; set; } 
    public SignUpViewModel SignUp { get; set; } 
} 

Methode Aktion:

[HttpPost, AllowAnonymous, ValidateAntiForgeryToken] 
public virtual async Task<ActionResult> SignUp(SignUpViewModel model) 
{ 
    if (!ModelState.IsValid) 
     return View("SignIn", new WelcomeViewModel { SignUp = model }); 

    // other code 
    return View(); 
} 

Als ich Veröffentlichen Sie die Daten, das Modell wird null. Ich weiß, dass die Eingänge wie generiert werden:

<input id="SignUp_CompanyName" name="SignUp.CompanyName"> 

Aber das Modell Binder übernimmt dies:

<input id="SignUp_CompanyName" name="CompanyName"> 

Jetzt möchte ich wissen, wie kann ich das Präfix entfernen? Ich weiß, dass ich Namen für jeden Eingang explizit hinzufügen kann:

, aber ich möchte es in einer starken Art Weise tun.

+1

Siehe entweder das '[Bindung]' Attribut als pro haim770 Antwort oder 'WelcomeViewModel' (nicht 'SignUpViewModel') zurückschreiben –

Antwort

0

Vielleicht ist der einfachste Weg, anzuwenden wäre die [Bind] mit seinem Prefix Set-Attribute auf „Registrieren“:

public async Task<ActionResult> SignUp([Bind(Prefix="SignUp")] SignUpViewModel model) 

MSDN

Verwandte Themen