Модель не обновляется в приложении MVC 2 - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть приложение с расписанием, в котором есть представление, в котором пользователь может выбирать клиентов и задачи и добавлять их в динамическую таблицу. Эта таблица заполнена задачами и полями ввода для заполнения отработанных часов.

Для добавления новых задач в динамическую таблицу я использую jQuery, поэтому кнопка savenewtask не является кнопкой отправки. Вместо этого у меня есть соответствующая кнопка отправки для сохранения часов при заполнении.

Вид строго типизирован для модели с именем TimesheetViewModel (см. Ниже). Контроллер передает модель в представление, а затем поля ввода связываются со свойствами в модели.

Однако, когда я отправляю с помощью кнопки отправки и пытаюсь обновить модель в контроллере, она не обновляется. Из руководства Nerddinner (которое я использую для изучения MVC) казалось, что модель должна автоматически обновляться с использованием значений из полей форм, с которыми она была связана при использовании UpdateModel (). Но это не так. Что я делаю не так?

Вот весь соответствующий код:

Вид:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            //Hook onto the MakeID list's onchange event
            $("#CustomerId").change(function () {
                //build the request url
                var url = "Timesheet/CustomerTasks";
                //fire off the request, passing it the id which is the MakeID's selected item value
                $.getJSON(url, { id: $("#CustomerId").val() }, function (data) {
                    //Clear the Model list
                    $("#TaskId").empty();
                    //Foreach Model in the list, add a model option from the data returned
                    $.each(data, function (index, optionData) {
                        $("#TaskId").append("<option value='" + optionData.Id + "'>" + optionData.Name + "</option>");
                    });
                });
            }).change();
        });

    </script>
    <h2>Index</h2>

    <% using (Html.BeginForm())
       {%>
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>Fields</legend>
        <div>
            <label for="Customers">
                Kund:</label>
            <%:Html.DropDownListFor(m => m.Customers, new SelectList(Model.Customers, "Id", "Name"), "Välj kund...", new { @id = "CustomerId" })%>
            &nbsp;&nbsp;
            <label for="Tasks">
                Aktiviteter:</label>
            <select id="TaskId">
            </select>
        </div>
        <p>
            <input type="button" value="Save new task" id="savenewtask" />            
        </p>

        <table width="100%">
        <%--<% foreach (var task in Model.Tasks)--%>
        <% foreach (var task in Model.WeekTasks)
           { %>
        <tr>
            <td>
                <%: task.Customer.Name %>
            </td>
            <td>
                <%: task.Name %>
            </td>
            <td>
                <% foreach (var ts in task.TimeSegments)
                   { %>
                <input class="hourInput" type="text" size="2" id="<%: ts.Task.CustomerId + '_' + ts.TaskId + '_' + ts.Date %>"
                    value="<%: ts.Hours %>" />
                <% } %>
            </td>
        </tr>
        <% } %>
    </table>
    <input type="submit" value="Save hours" id="savehours" />
    </fieldset>
    <% } %>

</asp:Content>

с контроллера:

private TimesheetViewModel _model;

public TimesheetController()
{
    _model = new TimesheetViewModel();
}

public ActionResult Index()
{

    return View(_model);
}

[HttpPost]
public ActionResult Index(FormCollection collection)
{
    try
    {
        UpdateModel(_model);
        _model.Save();
        return View(_model);
        //return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

ViewModel:

public class TimesheetViewModel
{
    private TimesheetContainer _model; //TimesheeContainer is an Entity Framework model

    public TimesheetViewModel()
    {
        _model = new TimesheetContainer();
    }

    public IList<Customer> Customers
    { get { return _model.Customers.ToList(); } }

    public IList<Task> Tasks
    { get { return _model.Tasks.ToList(); } }

    public IList<Task> WeekTasks
    {
        get
        {
            //Get the time segments for the current week
            DateTime firstDayOfWeek = DateTime.Parse("2010-12-05");
            DateTime lastDayOfWeek = DateTime.Parse("2010-12-13");

            List<TimeSegment> timeSegments = new List<TimeSegment>();
            foreach (var timeSegment in _model.TimeSegments)
            {
                if(timeSegment.DateTimeDate > firstDayOfWeek && timeSegment.DateTimeDate < lastDayOfWeek)
                    timeSegments.Add(timeSegment);
            }
            //Group into tasks
            var tasks = from timeSegment in timeSegments
                       group timeSegment by timeSegment.Task
                        into t
                      select new { Task = t.Key };
            return tasks.Select(t => t.Task).ToList();
        }
    }

    public IList<TimeSegment> TimeSegments
    { get { return _model.TimeSegments.ToList(); } }

    public void Save()
    {
        _model.SaveChanges();
    }


    public void AddTimeSegments(Task task)
    {
        _model.AddToTasks(task);
        _model.SaveChanges();
    }

}

Частичный класс для получения заданий на определенную неделю (только фиктивная неделя в настоящее время для тестирования):

public partial class TimeSegment
{
    public DateTime DateTimeDate
    { get { return DateTime.Parse(Date); } }
}

Почему модель не обновляется и что можно изменить, чтобы она работала?

1 Ответ

0 голосов
/ 09 декабря 2010

Поместите точку останова в ваш первый индекс ActionResult (), это вызывается, когда вы делаете отправку? вам может понадобиться [HttpGet] на нем, в противном случае я думаю, что он получает оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...