使用mvc4并使用Html.BeginForm在我的视图中调用另一个控制器
它运行正常!但这里使用文本框传递值。 如何使用
修改此代码@ Html.DisplayFor(modelItem => item.UserName) ....代替 @ Html.TextBox( “用户名”)
在这里我的观点:
它的形象:
@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");
}
另一种观点:
它的形象:
@{
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>
}
答案 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