Html.BeginForm传递Model项值

时间:2014-05-24 22:28:13

标签: c# html asp.net-mvc-4

使用mvc4并使用Html.BeginForm在我的视图中调用另一个控制器

它运行正常!但这里使用文本框传递值。 如何使用

修改此代码
  

@ Html.DisplayFor(modelItem => item.UserName)   ....代替   @ Html.TextBox( “用户名”)

在这里我的观点:

它的形象:enter image description here

                     @using OTMS.Models
        @model IEnumerable<OTMS.Models.UserProfile>

        @{
           ViewBag.Title = "Index";
        }

                <!-- Table Continer -->
        <div class="spacer_10px"></div>
        <div class="container clearfix">
            <div class="grid_12"> 
               <div class="table_wrapper table_gray">
        <table>

             <tr>
                <th>
                   <p>User Name</p>
                </th>
                 <th>
                   <p>Role</p>
                </th>
                 <th>
                   <p>Role</p>
                </th>
            </tr>


            @if (Model != null) {
        foreach (var item in Model) {
        <tr>


            <td>
                @Html.DisplayFor(modelItem => item.UserName)
            </td>

            <td>
              @using(Html.BeginForm("GetRoles", "Account",FormMethod.Post)){
              @Html.AntiForgeryToken()
            <div class="editor-label">Username : </div>
             @Html.TextBox("UserName") //here user will enter user name / I dont want user to enter that ,it should be done Automatically 



                  <div class="spacer_20px"></div>
                  <div class="button button-orange"> <span class=" form_button clearfix">
                  <input type="submit" class="submit" name="submit" value="Get Roles for this User" />
                  </span> </div>//by clicking that will pass the user name to controller (GerRole)/I dont want  button
        }


            </td>

            <td>

               @using (Html.BeginForm("Submit", "Account", FormMethod.Post))
           {
                     @Html.Hidden("userName", item.UserName)

                     @Html.DropDownList("selectedRole", (SelectList)ViewBag.Roles)

                     <div class="button button-orange"> <span class=" form_button clearfix">
                    <input type="submit" class="submit" name="submit" value="Update Change" />
                    </span> </div>
            }

            </td>
        </tr>

        }
            }
             </table>
                 </div> </div> 

这是我的控制器:

   public ActionResult Index()
    {
        var model = _db.UserProfiles.ToList();

        ViewBag.Roles = new SelectList(Roles.GetAllRoles());

        return View(model);
    }

    [HttpPost]

    public ActionResult GetRoles(string UserName)
    {
        if (!string.IsNullOrWhiteSpace(UserName))
        {
            ViewBag.RolesForThisUser = Roles.GetRolesForUser(UserName);
            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;


        }
        return View("showrole");
    }

另一种观点:

它的形象: enter image description here

            @{
                ViewBag.Title = "showrole";
            }

            <h2>showrole</h2>
            @if(ViewBag.RolesForThisUser != null) {
                <text>
                <h3>Roles for this user </h3>
                <ol>
            @foreach (string s in ViewBag.RolesForThisUser){
                <li>@s</li>   
            }
                            </ol>
                </text>
            }

3 个答案:

答案 0 :(得分:1)

您需要做的就是为您的视图创建一个视图模型,对我来说它看起来像这样:

public class UserViewModel
{
    public string UserName {get;set;}
    public IEnumerable<string> UserRoles { get; set; }
}

然后在索引操作中,您将返回这些视图模型的列表。 你当然可以这样做:

public ActionResult Index()
{
    var model = _db.UserProfiles.ToList()
                                .Select(u => new UserViewModel{
                                     UserName = u.UserName,
                                     UserRoles = Roles.GetRolesForUser(u.UserName)
                                                      .AsEnumerable()
                                })
                                .ToList();
    ViewBag.Roles = new SelectList(Roles.GetAllRoles());
    return View(model);
}

但我不会。这是因为使用此代码,您只需为每个用户执行一个aditional查询即可获得他的角色。我认为您需要将角色表添加到您的EntityFramework模型并尝试使用单个查询执行此操作。因此,您需要使用角色扩展UserProfile:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public ICollection<UserRoles> UserRoles { get; set; }
}

[Table("webpages_Roles")]
public class UserRoles
{
    [Key]
    public int RoleId { get; set; }
    public string RoleName { get; set; }

    public ICollection<UserProfile> UserProfiles { get; set; }
}

然后使用有关UserProfils和UserRoles之间多对多关系的信息更新您的DbContext:

public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserRoles>()
        .HasMany<UserProfile>(r => r.UserProfiles)
        .WithMany(u => u.UserRoles)
        .Map(m =>
        {
            m.ToTable("webpages_UsersInRoles");
            m.MapLeftKey("UserId");
            m.MapRightKey("RoleId");
        });
    }
}

在您的索引操作之后 - 您可以执行以下操作:

    var model = _db.UserProfiles.Select(u => new UserViewModel()
    {
        UserName = u.UserName,
        UserRoles = u.UserRoles.Select(ur=>ur.RoleName)
    }).ToList();

它将是一个查询,而不是循环中的几个。

编辑: 您的模型已更改,因此您需要将@model IEnumerable<OTMS.Models.UserProfile>更改为@model IEnumerable<OTMS.Models.UserViewModel> 然后:

@foreach(var user in Model)
{
    //display user
    @foreach(var role in user.UserRoles)
    {
        //display roles with @role
    }
}

如果要使用DisplayTemplates,可以移动逻辑以将用户显示为模板。为此,您需要按路径创建视图 的〜/查看/共享/ DisplayTemplates / UserViewModel.cshtml

@model OTMS.Models.UserViewModel
//display user
@foreach(var role in user.UserRoles)
{
     //display roles with @role
}

然后在Index.cshtml中,您可以将代码更改为:

@foreach (var user in Model)
{
    @Html.DisplayFor(n => user)
}

答案 1 :(得分:0)

首先,对于所有人来说,主要困惑在于这个助手......这里有一个Breif Look

  • 如果您想提供用户不需要注意的发布数据,请使用HiddenFor。“

  • 如果您想要显示记录但不允许对其进行编辑,请使用DisplayFor

  • 如果要允许用户输入或允许用户编辑字段,请使用TextBoxFor。 `

现在你的问题是这样的...... How can i use displayfor to hit my controller!!!!

你可以用一个HiddenFor和DisplayFor来完成这个。使用HiddenFor准备好发布值,并使用DisplayFor显示这些值。

以满足您的要求

<div class="editor-label"> Username : </div>
@Html.TextBox("UserName") 

替换

<div class="editor-label"> Username : </div>
@Html.HiddenFor(modelItem=>item.username)
@Html.DisplayFor(modelItem=>item.username) 

请记住Displayfor仅渲染标签在浏览器中,要将其发布回Controller,您需要HiddenFor

答案 2 :(得分:0)

试试这个:

控制器

[HttpPost]
public ActionResult GetRoles(string UserName)
{
    if (!string.IsNullOrWhiteSpace(UserName))
    {
        ViewBag.RolesForThisUser = Roles.GetRolesForUser(UserName);
        SelectList list = new SelectList(Roles.GetAllRoles());
        ViewBag.Roles = list;
    }
    return View("......");
}

视图

@ViewBag.Name
@using(Html.BeginForm("GetRoles", "Account")){
@Html.AntiForgeryToken()
<div class="editor-label">Username : </div>
@Html.TextBox("UserName")
<div class="spacer_20px"></div>
<div class="button button-orange">
    <span class=" form_button clearfix">
        <input type="submit" class="submit" name="submit" value="Get Roles for this User" />
    </span>
</div>
}

以下是 DEMO