2013-03-05 22 views
13

Mam problem, który po wysłaniu do kontrolera tracę wiązanie i wszystko w moim modelu widoku ma wartość NULL. Oto kod używam:Model widoku ASP.NET MVC niewiążący w poście HTTP z DropDownList

Widok:

@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>      
} 

ViewModel:

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; } 
} 

Kontroler:

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

    ReDrawDropDowns(vm); 
    return View(vm) 
} 

Dlaczego wszystko jest w moim widoku NULL? Widzę w użyciu narzędzi Chromes że w poście wartości są zamieszczone na strunach i wskazówki ... Jako pracy wokół Właśnie zrobić następujące czynności, aby dostać pracę kodu:

Obejście Kontroler:

[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) 
} 

Dzięki

Odpowiedz

39

Wygląda na to może być z powodu różnicy pomiędzy właściwościami i zmiennych jak zauważono w this question. Dodaj { get; set; } do wszystkich zmiennych, które chcesz powiązać. Jak zauważono w tym pytaniu, myślę, że dzieje się tak ze względu na sposób, w jaki domyślny segregator używa refleksji.

Znalazłem w przeszłości przydatne przy pobieraniu kodu źródłowego ASP.NET MVC, dzięki czemu mogę go debugować i zobaczyć, co się dzieje.

+2

To mnie napędzało NUTS. Czasami nie widzisz, co jest tuż przed twoimi oczami. –

+0

Ta poprawka działała idealnie. To także doprowadzało mnie do szaleństwa, ponieważ wyraźnie zobaczyłem dane opublikowane podczas monitorowania wniosku. –

2

do modelu wiązania w świetle należy użyć strongly-typed-html-helpers

zastąpić

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

do:

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

Istnieje jeszcze jeden powód, dla modelu widoku NULL:

  • Nazwa modelu w parametru działania jest taki sam, jak jedna z właściwości widzenia modelu


Przykład:

Model:

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

kontrolera:

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


Tip: tutaj sama nazwa oznacza przypadku wrażliwych ( NewBook ​​ jest taki sam jak NewBook ​​)

Tip: obliczu w MVC3 an d MVC4.

+2

Po prostu zostałem złapany przez ten ... wydaje się być dużo ukrytych zarezerwowanych słów/reguł z nazwami parametrów akcji ... kilka dni temu chciałem mieć parametr o nazwie "akcja", który złamał moją trasę! Gdzieś pod maską zakładam, że tworzy on anonimowy obiekt, taki jak wartość trasy, anonimowy obiekt, który zamienia te parametry na właściwości tego obiektu, więc jeśli użyjesz nazwy takiej jak "kontroler", "akcja" itp., To wkręca sprawy. –

+1

Widziane również w MVC5 –

Powiązane problemy