2015-04-24 3 views
0

Модели в моей модели просмотра всегда имеют значение NULL при отправке назад.ViewModel не отправляет обратно в asp.net MVC

Пожалуйста, смотрите мои коды:

Вот контроллер:

public ActionResult Create(long? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 

    Query query = db.Queries.Find(id); 
    if (query == null) 
    { 
     return HttpNotFound(); 
    } 

    var viewModel = new QueryViewModel(query); 

    return View(viewModel); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create (QueryViewModel viewModel, string Message) 
{ 
    //viewmodel processing here 
    //viewModel.Query is always null here 


    return View(); 
} 

Вот вид:

@model ViewModels.QueryViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.Query) 
    <div class="row"> 
     <h2>Post a reply</h2> 
    </div> 
    <div class="row"> 
     <div class="input-control textarea size12"> 
      @Html.TextArea("Message") 
     </div> 
    </div> 
    <div class="row"> 
     <input type="submit" value="Post Reply"/> 
    </div> 
} 

Вот 2 модели и ViewModel:

public class Query 
{ 
    public long QueryID {get;set;} 
    /** 
    * some properties goes here... 
    **/ 
} 

public class QueryReply 
{ 
    public long QueryReplyID {get;set;} 
    public long QueryID {get;set;} 
    /** 
    * some properties goes here... 
    **/ 

    public virtual Query Query {get;set;} 
} 

public class QueryViewModel 
{ 
    public Query Query {get;set;} 
    public IEnumerable<QueryReply> QueryReplies {get;set;} 

    public QueryViewModel() {} 

    public QueryViewModel (Query query) 
    { 
     Query = query; 
    } 
} 

Просьба помогите, спасибо!

--EDIT--

Кроме того, если я буду называть модель запроса в моем ViewModel как 'Query', на постбэка viewModel.Query все равно будет NULL. Но если я изменю имя модели запроса в моей модели ViewModel как «QueryModel» (или любое другое имя, кроме Query), viewModel.QueryModel будет иметь значение. Пожалуйста, объясните, почему это происходит? Еще раз спасибо ..

+2

Вы не можете использовать '@ Html.HiidenFor()' для сложного свойства (посмотрите на html ваш генератор!) Вам нужно создать элементы управления для каждого свойства, которое вы хотите опубликовать. Но вы должны использовать модель представления (модель представления содержит только те свойства, которые вам нужно редактировать/отображать в представлении - не для хранения других моделей данных) –

+0

Что касается вашего редактирования. вы не можете иметь параметр с именем так же, как имя свойства модели. Если ваша публикация (скажем) 'Query:« SomeValue »' 'DefaultModelBinder' находит параметр' Query' (который является сложным объектом) и пытается установить его на значение «SomeValue», которое, конечно же, терпит неудачу (вы не можете установить сложный объект к строке), и параметр становится нулевым. –

ответ

4

Как выглядит ваша HTML-форма?

Я подозреваю, что Html.HiddenFor(m => m.Query) ничего не печатать. Вам нужно распечатать определенные свойства модели:

@Html.HiddenFor(m => m.Query.QueryID) 

Смотрите также Is there some way to use @Html.HiddenFor for complete model?.

+0

Собираюсь проверить это, вернемся к вам через некоторое время, спасибо! – jomsk1e

+0

Вот и все! Это просто проблема разработчика LOL, отсутствие сна! Большое спасибо CodeCaster! 8 минут, чтобы принять ваш ответ. – jomsk1e

+0

проверьте мои изменения. Thanks .. – jomsk1e

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