2012-07-02 3 views
0

Мой вопрос связан с this question and answerсложная модель остается пустой после пост

Следующая комплексная модель:

public class EditSubmissionModel 
{ 
    public string foo { get; set; } 
    public Submission submission { get; set; } 
} 

Простая модель

[Table(Name = "Submission")] 
public class Submission 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
    public int SubmissionId { get; set; } 
    [Column] 
    public string Title { get; set; } 
} 

Вид:

@model Project.WebUI.Models.EditSubmissionModel 
@{ 
    ViewBag.Title = "editSubmission"; 
} 

<h2>editSubmission</h2> 
@using (Html.BeginForm()) 
{ 
    <legend>SubmissionModel</legend> 

    @Html.EditorFor(m => m.foo) 
    @Html.EditorFor(m => m.submission) 

    <input type="submit" value="Save" /> 
} 

editorTemplate

@model Project.Domain.Entities.Submission 
@Html.EditorFor(m => m.Title) 

контроллер

[Authorize] 
    [HttpPost] 
    public ActionResult editSubmission(string shortName, EditSubmissionModel model) 
    { 
     shortname = "second" (is ok) 
     model.foo = aaa (also ok i edited it on the view) 
     model.submission = null (not binded? or i dont know?) 

Я не могу увидеть ошибку, любые идеи?

+0

Этот код работает. Я протестировал его. Пожалуйста, покажите свой ** точный ** код, который не работает! Есть что-то еще, что вы не показываете. –

+0

копия теперь вставила мой код. – Vulcano

+0

Хорошо, позвольте мне ответить на ваш вопрос. –

ответ

2

Состояние не воспроизводится. Шаги:

  1. Создать новый ASP.NET MVC 3 приложение, используя шаблон по умолчанию
  2. Определение 2 модели:

    public class Submission 
    { 
        public int SubmissionId { get; set; } 
        public string Title { get; set; } 
    } 
    
    public class EditSubmissionModel 
    { 
        public string foo { get; set; } 
        public Submission submission { get; set; } 
    } 
    
  3. Изменить HomeController так, что она выглядит так:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(); 
        } 
    
        [HttpPost] 
        public ActionResult Index(string shortName, EditSubmissionModel model) 
        { 
         return Content(model.submission.Title); 
        } 
    } 
    
  4. Обновить ~/Views/Home/Index.cshtml так, чтобы оно выглядело так:

    @model EditSubmissionModel 
    @using (Html.BeginForm()) 
    { 
        <legend>SubmissionModel</legend> 
    
        @Html.EditorFor(m => m.foo) 
        @Html.EditorFor(m => m.submission) 
    
        <input type="submit" value="Save" /> 
    } 
    
  5. Добавить пользовательский шаблон редактор для Submission типа (~/Views/Home/EditorTemplates/.cshtml), как это:

    @model Submission 
    @Html.EditorFor(m => m.Title) 
    
  6. Хит Ctrl + F5, заполните форму и нажмите кнопку. Как и ожидалось, значение, введенное в текстовое поле Title, будет правильно привязано и отображено на экране.

Так что я повторяю вопрос, который я уже задал вам в разделе комментариев: что вы делали по-другому? Вы ответили, что это копия-вставка из вашего кода, но, как я показал вам (с полным пошаговым руководством), это не так.

Теперь вот подозрение, что у меня есть. Ваше фактическое действие POST выглядит следующим образом:

public ActionResult editSubmission(string shortName, EditSubmissionModel submission) 

и не так:

public ActionResult editSubmission(string shortName, EditSubmissionModel model) 

Обратите внимание на имя параметра.

+0

Я учусь у тебя каждый день. ваше объяснение является удивительным. –

+0

хорошо, я пробовал ваш шаг за шагом совет и ... он работает, поэтому его интересный, что я не могу воспроизвести свою собственную ошибку. Что касается вашего подозрения, его действительно модель – Vulcano

+0

Вот что я вам посоветую: начните сбрасывать части своего кода, пока вы не сузите его. Другой подход заключается в том, чтобы начать с рабочей версии, которую я показал вам, и постепенно расширять ее с помощью других частей вашего кода, пока вы не уменьшите его. К сожалению, я не могу вам помочь, не зная, какой код вы могли бы написать. –

0

@ Darin Dimitrov Вы были совершенно правы, что я делаю иначе. Код выше был полностью в порядке.Проблема была команда прибудет которая выглядела как:

[Authorize] 
public ActionResult editSubmission(string confShortName, string submission) 
{ 
    //do stuff 
    return View(); 
} 

, И ModelBinder получите проблемы, если HttpPost где-нибудь имеет такое же имя вроде HttpGet в моем представлении случае строки и Editsubmission.submission. Большое спасибо за подробный пошаговый совет!

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