视图模型返回回发MVC 5空 [英] viewmodel returns null on postback mvc 5

查看:135
本文介绍了视图模型返回回发MVC 5空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的问题,一个视图模型,视图时贴我得到空值的所有属性。

我研究了一下,我可以看到多种脂肪酶有这个问题,我尝试了一些解决方案,但没有人对我的作品。

这是我有:

视图模型:

 公共类EventViewModel
{
    公共projectEvent ProjectEvent {搞定;组; }
    公开名单<&EVENTTYPE GT;事件类型{搞定;组; }
}

控制器:

  [HTTPGET]
    公众的ActionResult AddEditEvent(INT?ID)
    {
        VAR eventViewModel =新EventViewModel();
        VAR projectEventModel =新projectEvent();
        如果(ID!= NULL)
        {
            使用(VAR DB =新DBEntities())
            {
                projectEventModel =(从db.projectEvents p
                                  其中,p.eventID == ID
                                  选择P).FirstOrDefault();
            }
        }        eventViewModel.ProjectEvent = projectEventModel;        使用(VAR DB =新DBEntities())
        {
            eventViewModel.eventTypes =(从db.eventTypes p
                          选择P).ToList();
        }        返回查看(eventViewModel);
    }    [HttpPost]
    公众的ActionResult AddEditEvent(EventViewModel projectEvent)
    {
        如果(ModelState.IsValid)
        {
            使用(VAR DB =新DBEntities())
            {
                db.projectEvents.AddOrUpdate(projectEvent);
                db.SaveChanges();
            }
        }
        返回RedirectToAction(事件);
    }

查看:

  @model TTB.ViewModels.EventViewModel@ {
    布局=〜/查看/共享/ _Layout_Main.cshtml
}< H2>添加/编辑事件< / H>@using(Html.BeginForm(AddEditEvent,管理))
{
    < D​​IV CLASS =容器>
        < D​​IV CLASS =COL-MD-8>
            < D​​IV CLASS =表单组>
                <标签=名与GT;名称和LT; /标签>
                @ Html.TextBoxFor(M = GT; m.ProjectEvent.eventName,新{@class =表格控})
                @ Html.ValidationMessageFor(M = GT; m.ProjectEvent.eventName)
            < / DIV>
            < D​​IV CLASS =表单组>
                <标签=名与GT;日期和LT; /标签>
                @ Html.TextBoxFor(M = GT; m.ProjectEvent.eventDate,新{@class =表格控})
                @ Html.ValidationMessageFor(M = GT; m.ProjectEvent.eventDate)
            < / DIV>
            < D​​IV CLASS =表单组>
                <标签=名与GT;事件类型< /标签>
                @ Html.DropDownListFor(V => v.ProjectEvent.eventType,新的SelectList(Model.eventTypes,eventTypeID,eventTypeName),新{@class =的形式控制下拉})
            < / DIV>
            @ Html.HiddenFor(M = GT; m.ProjectEvent.eventID)
        < / DIV>
        < D​​IV CLASS =COL-MD-8>
            <输入类型=提交级=BTN BTN-成功BTN-LG btnSaveEditVALUE =保存/>
        < / DIV>
    < / DIV>
}

任何想法,我究竟做错了什么?

由于提前,Laziale

更新:

渲染HTML输出:

 <形式的行动=/管理/ AddEditEvent的方法=后> < D​​IV CLASS =容器>
        < D​​IV CLASS =COL-MD-8>
            < D​​IV CLASS =表单组>
                <标签=名与GT;名称和LT; /标签>
                <输入类=表格控数据-VAL =真正的数据-VAL-所需=是必需的eventName的领域。 ID =ProjectEvent_eventNameNAME =ProjectEvent.eventName类型=文本值=/>
                <跨度类=现场验证,有效的数据valmsg换=ProjectEvent.eventName数据valmsg替换=真正的>< / SPAN>
            < / DIV>
            < D​​IV CLASS =表单组>
                <标签=名与GT;日期和LT; /标签>
                <输入类=表格控数据-VAL =真正的数据-VAL-日期=这个领域EVENTDATE必须是日期。数据-VAL-所需=是必需的EVENTDATE场。 ID =ProjectEvent_eventDateNAME =ProjectEvent.eventDate类型=文本值=/>
                <跨度类=现场验证,有效的数据valmsg换=ProjectEvent.eventDate数据valmsg替换=真正的>< / SPAN>
            < / DIV>
            < D​​IV CLASS =表单组>
                <标签=名与GT;事件类型< /标签>
                <选择类=的形式控制下拉ID =ProjectEvent_eventTypeNAME =ProjectEvent.eventType><期权价值=1>电影和LT; /选项>
< /选择>
            < / DIV>
            &所述;输入数据-VAL =真的数据-VAL-号码=字段EVENTID必须是一个数字。数据-VAL-所需=是必需的EVENTID场。 ID =ProjectEvent_eventIDNAME =ProjectEvent.eventID类型=隐藏值=0/>
        < / DIV>
        < D​​IV CLASS =COL-MD-8>
            <输入类型=提交级=BTN BTN-成功BTN-LG btnSaveEditVALUE =保存/>
        < / DIV>
    < / DIV>
< /表及GT;


解决方案

这是因为你有一个名为 projectEvent 你的模型的属性,你参考模型为 projectEvent 当它被传递回控制器。

修改

 公众的ActionResult AddEditEvent(EventViewModel projectEvent)

 公众的ActionResult AddEditEvent(EventViewModel模型)

(或者你选择的其他名字)

<一个href=\"http://tech.pro/blog/1930/don-t-name-a-model-the-same-as-a-property-you-re-trying-bind-in-aspnet-mvc\" rel=\"nofollow\">http://tech.pro/blog/1930/don-t-name-a-model-the-same-as-a-property-you-re-trying-bind-in-aspnet-mvc

I have this problem with a viewmodel, when the view is posted I'm getting null values for all the properties.

I've researched a bit, I can see multiple ppl have this problem, I tried some of the solutions but none of them works for me.

This is what I have:

Viewmodel:

public class EventViewModel
{
    public projectEvent ProjectEvent { get; set; }
    public List<eventType> eventTypes { get; set; }
}

Controller:

[HttpGet]
    public ActionResult AddEditEvent(int? id)
    {
        var eventViewModel = new EventViewModel();
        var projectEventModel = new projectEvent();
        if (id != null)
        {
            using (var db = new DBEntities())
            {
                projectEventModel = (from p in db.projectEvents
                                  where p.eventID == id
                                  select p).FirstOrDefault();
            }
        }

        eventViewModel.ProjectEvent = projectEventModel;

        using (var db = new DBEntities())
        {
            eventViewModel.eventTypes = (from p in db.eventTypes
                          select p).ToList();
        }

        return View(eventViewModel);
    }

    [HttpPost]
    public ActionResult AddEditEvent(EventViewModel projectEvent)
    {
        if (ModelState.IsValid)
        {
            using (var db = new DBEntities())
            {
                db.projectEvents.AddOrUpdate(projectEvent);
                db.SaveChanges();
            }
        }
        return RedirectToAction("Events");
    }

View:

@model TTB.ViewModels.EventViewModel

@{
    Layout = "~/Views/Shared/_Layout_Main.cshtml";
}

<h2>Add/Edit Event</h2>

@using (Html.BeginForm("AddEditEvent", "Admin"))
{
    <div class="container">
        <div class="col-md-8">
            <div class="form-group">
                <label for="name">Name</label>
                @Html.TextBoxFor(m => m.ProjectEvent.eventName, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.ProjectEvent.eventName)
            </div>
            <div class="form-group">
                <label for="name">Date</label>
                @Html.TextBoxFor(m => m.ProjectEvent.eventDate, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.ProjectEvent.eventDate)
            </div>
            <div class="form-group">
                <label for="name">Event Type</label>
                @Html.DropDownListFor(v => v.ProjectEvent.eventType, new SelectList(Model.eventTypes, "eventTypeID", "eventTypeName"), new { @class = "form-control dropdown" })
            </div>
            @Html.HiddenFor(m => m.ProjectEvent.eventID)
        </div>
        <div class="col-md-8">
            <input type="submit" class="btn btn-success btn-lg btnSaveEdit" value="Save" />
        </div>
    </div>
}

Any idea what am I doing wrong?

Thanks in advance, Laziale

UPDATE:

Rendered html output:

<form action="/Admin/AddEditEvent" method="post">    <div class="container">
        <div class="col-md-8">
            <div class="form-group">
                <label for="name">Name</label>
                <input class="form-control" data-val="true" data-val-required="The eventName field is required." id="ProjectEvent_eventName" name="ProjectEvent.eventName" type="text" value="" />
                <span class="field-validation-valid" data-valmsg-for="ProjectEvent.eventName" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="name">Date</label>
                <input class="form-control" data-val="true" data-val-date="The field eventDate must be a date." data-val-required="The eventDate field is required." id="ProjectEvent_eventDate" name="ProjectEvent.eventDate" type="text" value="" />
                <span class="field-validation-valid" data-valmsg-for="ProjectEvent.eventDate" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="name">Event Type</label>
                <select class="form-control dropdown" id="ProjectEvent_eventType" name="ProjectEvent.eventType"><option value="1">movie</option>
</select>
            </div>
            <input data-val="true" data-val-number="The field eventID must be a number." data-val-required="The eventID field is required." id="ProjectEvent_eventID" name="ProjectEvent.eventID" type="hidden" value="0" />
        </div>
        <div class="col-md-8">
            <input type="submit" class="btn btn-success btn-lg btnSaveEdit" value="Save" />
        </div>
    </div>
</form>

解决方案

It is because you have a property on your model called projectEvent and you refer to your model as projectEvent when it is passed back into the controller.

Change

public ActionResult AddEditEvent(EventViewModel projectEvent)

To

public ActionResult AddEditEvent(EventViewModel model)

(or another name of your choosing)

http://tech.pro/blog/1930/don-t-name-a-model-the-same-as-a-property-you-re-trying-bind-in-aspnet-mvc

这篇关于视图模型返回回发MVC 5空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆