开发者

Model state inferno - how can Model.A be two different things at the same time?

开发者 https://www.devze.com 2022-12-26 06:39 出处:网络
I have this <%=Model.StartDate%> <%=Html.Hidden(\"StartDate\", Model.StartDate)%> it outputs:

I have this

<%=Model.StartDate%>
<%=Html.Hidden("StartDate", Model.StartDate)%>

it outputs:

 2010-05-11 11:00:00 +01:00      
 <input type="hidden" value="2010-03-17 11:00:00 +01:00" name="StartDate" id="StartDate"> 

What the...

It's a paging mechanism so the hidden value was valid on the first page and I've been able to move forward to the next page. But since the values won't update properly it ends there.

What do I need to do?

Using firefox.

Update - more code

using (Html.BeginForm("Program", "Activities", null, FormMethod.Get, new { @name = "ProgramForm", id = "ProgramForm" }))
{ 

.

        viewModel.StartDate = pagingService.StartDate;
        return View(viewModel);

Update - complete action

    [Authorize]
    public ActionResult Program(string[] submit)
    {
        var viewModel = new ActivityProgramViewModel { UserID = LoggedInUser.UserID };
        viewModel.Fresh = true;

        TryUpdateModel(viewModel);

        var pagingService = new OccurencePagingService(LoggedInUser.AllActivities.Where(a => a.StartTime != null));

        if (!viewModel.Fresh)
        {
            pagingService.StartDate = ((DateTimeOffset)viewModel.StartDate);
            pagingService.EndDate = ((DateTimeOffset)viewModel.EndDate);
        }

        if (submit != null)
            if (submit.Contains("MoveBack"))
                pagingService.MoveBack();
            else if (submit.Contains("MoveForward"))
                pagingService.MoveForward();

        ViewData.Model = viewModel;

        viewModel.Occurrences = pagingService.GetOccurences开发者_如何学C();
        viewModel.Fresh = false;

        viewModel.HasLess = pagingService.HasLess;
        viewModel.HasMore = pagingService.HasMore;

        viewModel.StartDate = pagingService.StartDate;
        viewModel.EndDate = pagingService.EndDate;

        return View();
    }


First one uses Model object, second one uses existing ModelState. Look at ModelState values before generating view. It propably holds value for this field. Html helpers priveded by MVC use ModelState to generate form fields. It helps in recreating values after post back.

To get rid of this kind of problems, use POST-REDIRECT-GET pattern or just pass query parameters through GET.


I think the <%=Html.Hidden("StartDate", Model.StartDate)%> is out of place here.

Html Helpers try to keep data in the UI like they where entered by examining the post/route data. Please dont ask me how someone would ever enter data in a hidden field.

You want something different: You want to set the data to Model.StartDate and dont care what is in the post/route.

I would use <input value="<%=Model.StartDate%>" name="StartDate" /> .

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号