Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何传递带有可枚举对象的模型以供查看?_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 如何传递带有可枚举对象的模型以供查看?

C# 如何传递带有可枚举对象的模型以供查看?,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我是ASP.MVC4新手,在将对象从视图传递到控制器时遇到问题: 让我从一开始就解释我的问题: 所使用的我的类是例如:UserAndRolesModel public class UserAndRolesModel { public user User { get; set; } public IEnumerable<UserAndRoles> AsignedRoles { get; set; } } 我的控制器操作很简单,它将用户分配给UserWithRoles.

我是ASP.MVC4新手,在将对象从视图传递到控制器时遇到问题: 让我从一开始就解释我的问题: 所使用的我的类是例如:UserAndRolesModel

public class UserAndRolesModel
{
    public user User { get; set; }
    public IEnumerable<UserAndRoles> AsignedRoles { get; set; }
}
我的控制器操作很简单,它将用户分配给UserWithRoles.user,并使用UserAndRoles对象创建模板

    public ActionResult Edit(int userid=0)
    {
      //object which will be passed to View
      UserAndRolesModel UserWithRoles = new UserAndRolesModel();

      //user
      UserWithRoles.User = repoUsers.Users.FirstOrDefault(x => x.user_id == userid);

      //roles
      IList<UserAndRoles> tempList = new List<UserAndRoles>();
      UserAndRoles temp1 = new UserAndRoles();
      temp1.RoleName="Admin";
      temp1.IsAssigned=true;
      UserAndRoles temp2 = new UserAndRoles();
      temp2.RoleName="User";
      temp2.IsAssigned=false;
      tempList.Add(temp1);
      tempList.Add(temp2);

      //assign tempList to model
      UserWithRoles.AsignedRoles = tempList;

      return View(UserWithRoles);
    )
我能够正确显示以上视图:

@model Models.UserAndRolesModel
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <div class="editor-field">
            @Html.EditorFor(model => model.User.user_id)
            @Html.ValidationMessageFor(model => model.User.user_id)
        </div>


        <div class="editor-label">
            @Html.LabelFor(model => model.User.user_name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.User.user_name)
            @Html.ValidationMessageFor(model => model.User.user_name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.User.user_active)
        </div>
        <div class="editor-field">
            @Html.CheckBoxFor(model => model.User.user_active)
            @Html.ValidationMessageFor(model => model.User.user_active)
        </div>

        <br /> ROLES below is piece of code which makes me cry<br />
        @foreach (var item in Model.AsignedRoles)
        {
            <div class="editor-field">
            <div class="editor-field">
               @Html.LabelFor(model => item.RoleName)
               @Html.CheckBoxFor(model => item.IsAssigned)
            </div>
            </div>
        }

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
在视图中,我尝试使用其他循环,例如:

    @for (int i = 0; i < Model.AsignedRoles.Count(); i++)
    {
             <div class="editor-field">
               @Html.LabelFor(model => item[i].IsAssigned)
               @Html.CheckBoxFor(model => item[i].IsAssigned)
             </div>
    }
@for(int i=0;iitem[i].IsAssigned)
@Html.CheckBoxFor(model=>item[i].IsAssigned)
}
但上面也没有通过IEnumerable。 有人能帮我解决这个问题吗?如何传回包含IEnumerable的控制器UserAndrolesModel?
我将非常感激。提前谢谢你的帮助

对于循环,您确实需要
,但是您尝试的循环引用了
项[i]
,但是
项[i]
不再存在。试试这个,请注意,我还为
RoleName
添加了一个
HiddenFor
,否则不会传回:

@for (int i = 0; i < Model.AsignedRoles.Count(); i++)
{
         <div class="editor-field">
           @Html.LabelFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.CheckBoxFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.HiddenFor(model => model.AssignedRoles[i].RoleName)
         </div>
}
@for(int i=0;imodel.AssignedRoles[i].IsAssigned)
@Html.CheckBoxFor(model=>model.AssignedRoles[i].IsAssigned)
@Html.HiddenFor(model=>model.AssignedRoles[i].RoleName)
}

您能否使用Fiddler查看实际被发回的内容?您是否尝试使用
IList
而不是
IEnumerable
?还有,因为我不能忍受不评论它
AsignedRoles
缺少s,并且
UserWithRoles
不遵循小写变量名称的约定。^不要管IList,使用for循环是您需要的。您还应该检查html源代码,查看它是否正在生成类似于
[0].IsAssigned[…][1].IsAssigned
的内容。绑定列表的任务很好,这个问题在网站上也被问了无数次。感谢AlexanderBrevig,问题出在IEnumerable和IList中。我不得不把它改成IList,现在它工作得很好。谢谢Mattytomo的回答!问题出在IEnumerable和IList中,但您的代码帮助我弄清楚了。谢谢你们的帮助!!!!
[HttpPost]
public ActionResult Edit(UserAndRolesModel UserWithRoles)
    {
        if (ModelState.IsValid)
        {
                        if (UserWithRoles.AsignedRoles==null)
                            Console.WriteLine("I am still crying");
                        else
                            Console.WriteLine("Got it!");
        }
        return View(UserWithRoles);
    }
    @for (int i = 0; i < Model.AsignedRoles.Count(); i++)
    {
             <div class="editor-field">
               @Html.LabelFor(model => item[i].IsAssigned)
               @Html.CheckBoxFor(model => item[i].IsAssigned)
             </div>
    }
@for (int i = 0; i < Model.AsignedRoles.Count(); i++)
{
         <div class="editor-field">
           @Html.LabelFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.CheckBoxFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.HiddenFor(model => model.AssignedRoles[i].RoleName)
         </div>
}