2013-06-19 3 views
0

У меня возникла проблема с отправкой ViewModel обратно контроллеру, но ViewModel не отображается правильно из представления в контроллер.ASP.Net MVC Postback from View to Controller показывает нулевые значения

TopicID и Содержимое должны содержать значения, однако, когда вывешены назад, они не:

VS Debug: ss

ViewModels:

public class PostViewModel 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Author { get; set; } 
    public DateTime DateOfTopic { get; set; } 
} 

public class ReplyViewModel 
{ 
    public int TopicId { get; set; } 
    public string Content { get; set; } 

} 

public class PostListAndReplyVM 
{ 
    public List<PostViewModel> PostViewModel { get; set; } 
    public ReplyViewModel ReplyViewModel { get; set; } 
} 

Вид:

@model centreforum.Models.PostListAndReplyVM 

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Post</legend> 

     @Html.HiddenFor(model => model.ReplyViewModel.TopicId) 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ReplyViewModel.Content) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ReplyViewModel.Content) 
     @Html.ValidationMessageFor(model => model.ReplyViewModel.Content) 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

}

Сгенерированный HTML:

<form action="/Post/List/7/" method="post"><input name="__RequestVerificationToken" type="hidden" value="xxxxxxxxxxxxx" /> <fieldset> 
    <legend>Post</legend> 

     <input data-val="true" data-val-number="The field TopicId must be a number." data-val-required="The TopicId field is required." id="ReplyViewModel_TopicId" name="ReplyViewModel.TopicId" type="hidden" value="7" /> 

    <div class="editor-label"> 
     <label for="ReplyViewModel_Content">Content</label> 
    </div> 
    <div class="editor-field"> 
     <input class="text-box single-line" id="ReplyViewModel_Content" name="ReplyViewModel.Content" type="text" value="" /> 
     <span class="field-validation-valid" data-valmsg-for="ReplyViewModel.Content" data-valmsg-replace="true"></span> 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
</form> 

Как вы можете видеть из сгенерированного HTML, то TopicID, безусловно, имеет значение: value="7"

Может кто-нибудь видит, где проблема между сообщением формы и контроллером, который ожидает ReplyViewModel?

Спасибо,

Марку

+0

Можете ли вы показать метод HTTPGET публичного списка ActionResult()? –

ответ

3

ваших имен поля ввода начинается с ReplyViewModel (из-за model => model.ReplyViewModel.* лямбды), так что вы должны указать эту информацию в модели вяжущий:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult List([Bind(Prefix = "ReplyViewModel")] ReplyViewModel model) 
{ 
    ... 
} 

В качестве альтернативы есть ваши действия тека List модель PostListAndReplyVM:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult List(PostListAndReplyVM model) 
{ 
    // obviously only model.ReplyViewModel will be bound here because 
    // those are the only input fields in your form 
    ... 
} 
+0

Его взлом :) Вы уверены, что это хорошее решение? – maxs87

+0

Я не думаю, что это взломать. –

2

Его нуль, потому что вы обвили его на другую модель

Ввиду

@model centreforum.Models.PostListAndReplyVM

в действии, ReplyViewModel

попытаться связываем как

public ActionResult SomeAction(PostListAndReplyVM model) 

    { 
    } 
+0

Привет - PostListAndReplyVM содержит две модели (я удалил HTML вне формы, для PostViewModel) - в форме, я ссылаюсь на это на: => model.ReplyViewModel.TopicId - спасибо. – Mark

3

проблема заключается в том, что ваша точка зрения набирается на PostListAndReplyVM - поэтому он создает п например, ReplyViewModel.Content - но, поскольку ваше действие контроллера ожидает ReplyViewModel, эти поля не могут быть связаны (т. нет такой вещи, как ReplyViewModel.ReplyViewModel.Content).

Изменить действие контроллера:

public ActionResult List(PostListAndReplyVM reply) 

В качестве альтернативы - если это вся ваша точка зрения - просто введите его ReplyViewModel вместо (и обновить HtmlHelper выражения соответственно).

Смежные вопросы