MVC3 Данные в модели установлены на ноль при публикации - PullRequest
0 голосов
/ 30 января 2012

У меня сейчас есть вид, где модель - это список моделей, которые передаются в частичное представление и отображаются в виде списка на странице.Частичное представление имеет форму, которая при отправке должна отправлять модель обратно в контроллер, где она может перенаправить модель на страницу для редактирования ее свойств.Тем не менее, после публикации один из элементов данных модели имеет значение null, и я не могу понять, почему.Вот код, который я использую, который влияет на эту часть программы:

Модель

public class ViewEntryModel
{
    #region properties

    public long ActivityID { get; set; }
    public Activity ActivityModel { get; set; }
    public string ActivityType { get; set; }
    public DateTime Date { get; set; }
    public string ActivityName { get; set; }
    public string Answer { get; set; }

    #endregion

}

В главном представлении

<ul id="all_entries">
@foreach (var entry in Model)
{
    <div id="@String.Format("entry{0}", entry.ActivityID)">@Html.Partial("UserEntryRow", entry)</div>
}

В частичном представлении

@model Web.Models.ViewEntryModel

<div class="entryInformation">
    <div class="left">
        <span>@Model.Date.Month/@Model.Date.Day/@Model.Date.Year</span>
    </div>
    <div class="right">
        @using(Html.BeginForm("EditEntry", "UserEntry", Model))
        { 
            <input type="submit" value="Edit" /> 
        } <a>delete</a>
    </div>
    <div class="middle">
        @if (Model.ActivityType.Equals("Exercise"))
        { 
            <span>You completed the <strong>@Model.ActivityName</strong> exercise for <strong>@Model.Answer</strong>.</span>
        }
        else if (Model.ActivityType.Equals("Question"))
        { 
            <span>You answered <strong>@Model.ActivityName</strong> with <strong>@Model.Answer</strong>.</span>
        }
        else if (Model.ActivityType.Equals("Nutrition"))
        { 
            <span>You ate <strong>@Model.Answer</strong> servings of <strong>@Model.ActivityName</strong>.</span>
        }
    </div>
</div>

Метод контроллера, который он отправляет в

[HttpPost]
    [Authorize(Roles = "User")]
    public ActionResult EditEntry(ViewEntryModel model)
    {
        if (model.ActivityType.Equals("Exercise"))
        {
            ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
            return RedirectToAction("LogPastExerciseActivity", "UserDashboard", exerciseActivity);
        }

        return RedirectToAction("Index");
    }

Когда он публикует, model.ActivityModel имеет значение null, хотя при отладке он был правильно установлен внутри представления.Любые идеи относительно того, что может быть причиной этого?

1 Ответ

0 голосов
/ 30 января 2012

Я думаю, у вас есть несколько вопросов для решения здесь.

  1. ViewEntryModel.ActivityModel объявлен как тип Activityl, поэтому система привязки попытается создать его как экземпляр этого класса. Поэтому эта строка всегда будет неудачной:

    ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
    
  2. Видите, как вы используете классы Activity - это Activity абстрактно? Если так, то система привязки оставляет его равным нулю.

  3. Частичное не публикует никаких свойств Activity; попробуйте добавить

    @Html.TextBoxFor(m => m.Activity.Name)
    

    ... или что-то в этом роде; все, что подходит для Activity класса.

Если вы хотите использовать свойства ActivityType / ActivityModel как есть, вы можете создать пользовательский ValueProvider для создания Activity объектов на основе значений ActivityType. Кроме того, вы можете создать выделенные типы ViewEntryModel для каждого типа Activity и опубликовать их для различных действий.

...