首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将模型值从视图传递到控制器不起作用

将模型值从视图传递到控制器不起作用
EN

Stack Overflow用户
提问于 2013-02-04 01:12:15
回答 2查看 1.7K关注 0票数 1

我的模型有两个属性,其中一个是另一个类的对象

代码语言:javascript
复制
  public class Association : Entity
{
    public Association()
    {
        this.User = new User();
    }

    public User User
    {
        get;
        set;
    }

    public Role Role
    {
        get;
        set;
    }
};

我的观点是这个模型的强类型

代码语言:javascript
复制
@model MuddyBoots.Greenlight.Association
.
.
@using (Html.BeginForm())
{

@Html.ValidationSummary(true)
    <div>
     @Html.TextBoxFor(model => model.User.FirstName,new { id = "first-name" })
    <span class="red-asterisk">@Html.ValidationMessageFor(model =>    model.User.FirstName)</span>
 </div>
   <div>
    @Html.HiddenFor(model => model.Role, new { id="hiddenRole"})
        <ul id="user-roles">
            <li><input type="radio" name="user-role" id="role-admin" value="01" checked="checked" /> Read only</li>
            <li><input type="radio" name="user-role" id="role-member" value="02" /> Restricted</li>
            <li><input type="radio" name="user-role" id="role-read" value="03"/> Standard</li>
            <li><input type="radio" name="user-role" id="role-subscriber" value="04" /> Administrator</li>
        </ul>
</div>
}

我的控制器函数是这样写的:

代码语言:javascript
复制
[HttpPost]
    public ActionResult AddUser(Association association)
    {
        string firstName = association.User.FirstName;
        var role = association.Role;

         IRepository<Association> associationRepository = new IRepository<Association>(db);
        if (ModelState.IsValid)
        { 
           siteRepository.Update(site);
            return RedirectToAction("Index");
        }
        return View(association);
    }

我的问题是:当我发布我的视图时,我的关联对象是空的,它没有值。

更准确地说,当我尝试调试这两行代码时:

代码语言:javascript
复制
 string firstName = association.User.FirstName;
 var role = association.Role;    

它们的值为空,但是如果我注释第一行,角色变量就会有一个值。所以我感觉到这个问题与用户属性有关,但我不知道如何解决它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-04 01:29:19

我不认为ModelBinder会绑定子对象。您可以创建一个自定义的ModelBinder来绑定您的关联类,或者只创建一个ViewModel类来将您当前的模型展平为一个类。因此,您的AssociationViewModel模型类可能如下所示:

代码语言:javascript
复制
public class AssociationViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string RoleName { get; set; }
}


public ActionResult AddUser(AssociationViewModel associationViewModel)
{
    if (ModelState.IsValid)
    { 
        var association = new Association
        {
            User.FirstName = associationViewModel.FirstName,
            Role = new Role { Name = associationViewModel.RoleName }
        };

        IRepository<Association> associationRepository = new IRepository<Association>(db);
        ....
    }
 }
票数 1
EN

Stack Overflow用户

发布于 2013-02-04 01:15:43

您似乎已经为角色类型使用了一些隐藏字段:

代码语言:javascript
复制
@Html.HiddenFor(model => model.Role, new { id = "hiddenRole" })

但Role属性是复杂类型,不能将其序列化为隐藏字段。对于要发送的每个属性,您必须使用隐藏字段:

代码语言:javascript
复制
@Html.HiddenFor(model => model.Role.Property1)
@Html.HiddenFor(model => model.Role.Property2)
@Html.HiddenFor(model => model.Role.Property...)

此外,您似乎在表单中使用了一些名为user-role的单选按钮,但是您不能在角色类上使用此名称的属性(您不能在属性名称中使用破折号),所以我猜如果您希望将这些单选按钮的值绑定到关联模型上的角色类的某些属性,则必须在此处使用正确的名称。

例如,假设您的角色类如下所示:

代码语言:javascript
复制
public class Role
{
    public string Value { get; set; }
}

现在,您的视图可能如下所示:

代码语言:javascript
复制
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <div>
        @Html.TextBoxFor(model => model.User.FirstName, new { id = "first-name" })
        <span class="red-asterisk">
            @Html.ValidationMessageFor(model => model.User.FirstName)
        </span>
    </div>
    <div>
        <ul id="user-roles">
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "01", new { id = "role-admin" }) 
                Read only
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "02", new { id = "role-member" }) 
                Restricted
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "03", new { id = "role-read" }) 
                Standard
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "04", new { id = "role-subscriber" }) 
                Administrator
            </li>
        </ul>
    </div>

    <button type="submit">OK</button>
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14674982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档