2013-03-05 10 views
13

Ich habe ein Problem, dass, wenn ich auf einen Controller posten ich Bindung verlieren und alles in meinem View-Modell ist NULL. Hier ist der Code ich verwende:ASP.NET MVC View Model nicht verbindlich auf HTTP Post mit DropDownList

Ausblick:

@model ArticleCategoryVm 

@using (@Html.BeginForm()) 
{ 
    @Html.HiddenFor(model => model.LanguageIdDisplayed) 

    <label>Name: <span class="label label-important">Required</span></label> 
    @Html.HmlValidationFor(model => model.CategoryName) 
    @Html.TextBoxFor(model => model.CategoryName, new { maxlength = "255", placeholder = "Category Name", @class = "input-xlarge-fluid" })     
    <span class="help-block">The is the name of the category and how it appears on the site.</span> 

    <label>Language: <span class="label label-important">Required</span></label> 
    @Html.HmlValidationFor(model => model.LanguageId) 
    @Html.DropDownList("LanguageId", new SelectList(@Model.Languages, "Value", "Text"), "Select language", new { @class="input-xlarge-fluid" }) 
    <span class="help-block">This will be the language that the category is set too.</span> 

    <label>Parent:</label> 
    @Html.HmlValidationFor(model => model.CategoryParentId) 
    @Html.DropDownList("CategoryParentId", new SelectList(@Model.CategoryParents, "Value", "Text"), new { @class = "input-xlarge-fluid" }) 
    <span class="help-block">Allows you to group the category under another existing category.</span> 

    <label>Moderator Email: <span class="label label-important">Required</span></label> 
    @Html.HmlValidationFor(model => model.ModeratorEmail) 
    @Html.TextBoxFor(model => model.ModeratorEmail, new { maxlength = "255", placeholder = "Email Address", @class = "input-xlarge-fluid" }) 
    <span class="help-block">This is the moderator email for articles in this category.</span> 

    <button type="submit" class="btn btn-duadua btn-small"><i class="icon-ok-3"></i> Add New Category</button>      
} 

Ansichtsmodell:

public class ArticleCategoryVm : BaseLayoutVm 
{ 
    public int LanguageIdDisplayed; 
    public List<ArticleCategoryItemVm> ArticleCategoryItemVms { get; set; } 

    // Add Category Fields 
    [Required] 
    public string CategoryName; 

    [EmailAttribute] 
    [Required] 
    public string ModeratorEmail; 

    [Required] 
    public int LanguageId; 

    public int CategoryParentId; 

    public List<SelectListItem> Languages { get; set; } 
    public List<SelectListItem> CategoryParents { get; set; } 
} 

Controller:

[HttpPost] 
public ActionResult Categories(ArticleCategoryVm vm) 
{ 
    // Code here 
    if (ModelState.IsValid) 
    { 
    } 

    ReDrawDropDowns(vm); 
    return View(vm) 
} 

Warum ist alles in meinem ViewModel NULL? Ich kann bei der Verwendung Chromes Tools sehen, dass die Werte in der Post werden für die Saiten und Ints ... Als ein Werk geschrieben werden um ich gerade getan haben, die nach dem Code zum Laufen zu bringen:

Abhilfe Controller:

[HttpPost] 
public ActionResult Categories(int LanguageIdDisplayed, string CategoryName, string ModeratorEmail, int LanguageId, int CategoryParentId) 
{ 
    var vm = new ArticleCategoryVm() 
    { 
     CategoryName = CategoryName, 
     LanguageIdDisplayed = LanguageIdDisplayed, 
     ModeratorEmail = ModeratorEmail, 
     LanguageId = LanguageId, 
     CategoryParentId = CategoryParentId 
    }; 

    if (ModelState.IsValid) 
    { 
    } 

    ReDrawDropDowns(vm); 
    return View(vm) 
} 

Dank

Antwort

39

Sieht aus wie es wegen einer Differenz zwischen Eigenschaften und Variablen in this question wie erwähnt sein könnte. Fügen Sie allen Variablen, die Sie binden möchten, { get; set; } hinzu. Wie ich in dieser Frage angemerkt habe, liegt das an der Art und Weise, wie der Standardmodellbinder die Reflexion verwendet.

Ich habe es in der Vergangenheit nützlich gefunden, den ASP.NET MVC-Quellcode tatsächlich zu greifen, damit ich es debuggen und sehen kann, was vor sich geht.

+2

Das trieb mich NUTS. Manchmal siehst du nicht, was direkt vor deinen Augen ist. –

+0

Dieser Fix hat perfekt funktioniert. Es hat mich auch verrückt gemacht, da ich die Daten während der Überwachung der Anfrage klar gesehen habe. –

2

in View Bindung an modellieren Sie strongly-typed-html-helpers

ersetzen verwenden sollten

zu:

@Html.DropDownListFor(model => model.CategoryParentId, new SelectList(@Model.CategoryParents, "Value", "Text"), new { @class = "input-xlarge-fluid" }) 
33

Es ist ein weiterer Grund für Ansicht Modell ist NULL:

  • Der Name des Modells in Aktionsparameter die gleiche sein wie eine der Eigenschaften der View-Modell


Beispiel:

Modell:

public class NewBookPageView{ 
    int blabla {get;set;} 
    Book NewBook {get;set;} //NewBook is the same as newBook in action parameter 
} 

Controller:

[HttpPost] 
public ActionResult AddNewBook(NewBookPageView newBook)//newBook is the same as NewBook in view 
{ 
    int temp = newBook.blabla; 
    temp++; 
    //... 
} 


Tipp: Hier gleiche Name bedeutet Groß- und Kleinschreibung ( newBook ​​ ist die gleiche wie Newbook)

Tipp: Faced in MVC3 an d MVC4.

+2

Ich bin gerade von diesem hier erwischt worden ... scheint eine Menge versteckter reservierter Wörter/Regeln mit Aktionsparameternamen zu sein ... vor ein paar Tagen wollte ich einen Parameter namens 'action' haben, der mein Routing kaputt gemacht hat! Irgendwo unter der Haube nehme ich an, dass es ein anonymer Gegenstand wie das anonyme Objekt der Routenwerte macht, das diese Parameter in Eigenschaften für dieses Objekt verwandelt. Wenn Sie also einen Namen wie 'Controller', 'Aktion' usw. verwenden, wird alles vermasselt. –

+1

Gesehen auch in MVC5 –

Verwandte Themen