加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

Asp.net MVC 3:控制器中的模型是空的吗?

发布时间:2020-12-16 06:30:38 所属栏目:asp.Net 来源:网络整理
导读:我有一个表单,我只需要在几个实体之间进行选择. 所以这就是我所做的: 创建了一个视图模型: public class EntityChooserModel { public IEnumerableEntity AvailableEntities { get; set; } public int SelectedId; } 我在控制器中有两个动作,一个是[HTTPPo
我有一个表单,我只需要在几个实体之间进行选择.

所以这就是我所做的:

创建了一个视图模型:

public class EntityChooserModel
    {
        public IEnumerable<Entity> AvailableEntities { get; set; }
        public int SelectedId;
    }

我在控制器中有两个动作,一个是[HTTPPost],一个没有.在两者中我都有一个“SessionUserData”,它是会话数据,通过数据模型绑定绑定.

[Authorize]
        public ActionResult EntityChooser(SessionUserData sessionData)
        {
            List<Entity> entities = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).ToList();


            Entity entity = sessionData.IdCurrentEntity != null ? entities.Where(e => e.Id == sessionData.IdCurrentEntity).First() : entities.First();

            return View(new EntityChooserModel() { SelectedId = entity.Id,AvailableEntities = entities });
        }

.

[Authorize]
    [HttpPost]
    public ActionResult EntityChooser( EntityChooserModel model,SessionUserData sessionData,String returnUrl)
    {
        if (ModelState.IsValid)
        {
            Entity entity = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).Where(e => e.Id == model.SelectedId).First();
            sessionData.IdCurrentEntity = entity.Id;
            RedirectToDefaultPage(returnUrl);
        }
        return View(model);
    }

强类型视图:

@model My.Full.Namespace.EntityChooserModel
@{
    ViewBag.Title = "EntityChooser";
    Layout = "~/Views/Shared/_LoginLayout.cshtml";
}
<div id="login-wrapper">
    <div id="title">
        <h1>Login</h1>
    </div>
    <div id="login">
        @using (Html.BeginForm("EntityChooser","Auth",FormMethod.Post,new { id = "ChooseFormId" }))
        {            
            @Html.ValidationSummary(true,"Loggin error")
            <div>
                <span>Choose an entity:</span>
                @Html.DropDownListFor(x => x.SelectedId,new SelectList(Model.AvailableEntities,"Id","Name"))
            </div>
            <p class="right-aligned">
                <a href="javascript:document.getElementById('ChooseFormId').submit();" class="adm-button">
                    <span class="next-btn"><span>Select</span></span></a>
            </p>
            <input type="submit" style="display: none" />
        }
    </div>
</div>

问题是,当我在第二个模型中收到数据时,我有一个空对象.该集合为空,id设置为默认值(0).

怎么了?我无法找到我在这个上错过的东西.

这是我第一次做一个不是ForModel()的mvc表单,而且我第一次使用下拉列表

解决方法

您< form>的唯一输入元素contains是一个下拉列表,在POSTed时仅将所选值发送到服务器.这解释了您的AvailableEntities集合属性为空的原因.

至于为什么SelectedId字段为空,这是因为您已将其定义为字段而不是属性.默认模型绑定器仅适用于属性.因此,如果您希望填充它,则必须将其定义为属性:

public int SelectedId { get; set; }

就AvailableEntities属性而言,您可以使用所选的id在POST操作中从存储库中填充它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读