Jquery ASP.NET MVC 3-ViewModel&;刷新-问题
我被困在ViewModel绑定和刷新场景中 情景: 作为管理员,我希望创建用户帐户,并根据DropDownList刷新表单中的选定角色,通过复选框选择与角色连接的特定访问(bool) 所以用户可以有一个具有默认访问列表的角色,管理员可以在创建帐户时修改该列表 我的ViewModel:Jquery ASP.NET MVC 3-ViewModel&;刷新-问题,jquery,asp.net-mvc,asp.net-mvc-3,refresh,viewmodel,Jquery,Asp.net Mvc,Asp.net Mvc 3,Refresh,Viewmodel,我被困在ViewModel绑定和刷新场景中 情景: 作为管理员,我希望创建用户帐户,并根据DropDownList刷新表单中的选定角色,通过复选框选择与角色连接的特定访问(bool) 所以用户可以有一个具有默认访问列表的角色,管理员可以在创建帐户时修改该列表 我的ViewModel: public class CreateViewModel { public User User { get; set; } public IEnumerable<Role> Roles
public class CreateViewModel
{
public User User { get; set; }
public IEnumerable<Role> Roles { get; set; }
public IEnumerable<RoleAccess> RoleAcceses { get; set; }
public Role SelectedRole { get; set; }
public void Refresh()
{
User.UserAccesses.Clear();
foreach (var item in RoleAcceses.Where(x => x.RoleId == SelectedRole.Id))
{
User.UserAccesses.Add(new UserAccess { UserId = User.Id, Access = item.Access, AccessId = item.AccessId, Value = item.Value });
}
}
}
公共类CreateViewModel
{
公共用户{get;set;}
公共IEnumerable角色{get;set;}
公共IEnumerable角色集{get;set;}
公共角色SelectedRole{get;set;}
公共无效刷新()
{
User.useraccess.Clear();
foreach(角色列表中的变量项,其中(x=>x.RoleId==SelectedRole.Id))
{
User.UserAccess.Add(新的UserAccess{UserId=User.Id,Access=item.Access,AccessId=item.AccessId,Value=item.Value});
}
}
}
正如您在上面的代码中所看到的,我有RoleAccess集合,其中包含特定角色的默认值。刷新方法清除实际的UserAccess集合,并为SelectedRole重新填充它
我的问题是:
public class AccountController : Controller
{
IAccountService accountService;
public AccountController()
{
accountService = new AccountService();
}
[HttpGet]
public ActionResult Create(int role = 1)
{
IEnumerable<RoleAccess> roleAccesses = null;
IEnumerable<Role> roles = null;
roleAccesses = accountService.GetRoleAcgesses();
roles = accountService.GetRoles();
var createViewModel = new CreateViewModel();
createViewModel.RoleAcceses = accountService.GetRoleAccesses();
createViewModel.Roles = accountService.GetRoles();
createViewModel.SelectedRole = createViewModel.Roles.FirstOrDefault(x => x.Id == role);
createViewModel.Refresh();
return View(createViewModel);
}
public ActionResult Refresh(int role)
{
return RedirectToAction("Create", "Account", new { role });
}
[HttpPost]
public ActionResult Create([Bind(Prefix = "User")] Models.User user, FormCollection formsCollection)
{
var viewModel = new CreateViewModel();
UpdateModel<CreateViewModel>(viewModel, new[] { "User.Login", "User.Password", "User.FirstName", "User.LastName" });
viewModel.User.RoleId = Convert.ToInt32(formsCollection["Role"]);
if (ModelState.IsValid)
{
bool result = accountService.CreateAccount(viewModel.User);
if (!result)
{
// SEND INFO ABOUT FAILURE
}
else
{
return RedirectToAction("list");
}
}
return View();
}
[HttpGet]
public ActionResult List()
{
var accounts = accountService.GetAccounts();
var viewModel = new ListViewModel() { Accounts = accounts };
return View(viewModel);
}
}
公共类AccountController:控制器
{
国际会计服务会计服务;
公共账户控制员()
{
accountService=新的accountService();
}
[HttpGet]
公共操作结果创建(int角色=1)
{
IEnumerable roleAccesses=null;
IEnumerable角色=null;
roleAccesses=accountService.getroleaccesses();
roles=accountService.GetRoles();
var createViewModel=新的createViewModel();
createViewModel.RoleAccesses=accountService.GetRoleAccesses();
createViewModel.Roles=accountService.GetRoles();
createViewModel.SelectedRole=createViewModel.Roles.FirstOrDefault(x=>x.Id==role);
createViewModel.Refresh();
返回视图(createViewModel);
}
公共操作结果刷新(int角色)
{
返回RedirectToAction(“创建”、“帐户”、新建{role});
}
[HttpPost]
公共操作结果创建([Bind(Prefix=“User”)]Models.User用户,FormCollection formsCollection)
{
var viewModel=new CreateViewModel();
UpdateModel(viewModel,新[]{“User.Login”、“User.Password”、“User.FirstName”、“User.LastName”});
viewModel.User.RoleId=Convert.ToInt32(formsCollection[“角色]);
if(ModelState.IsValid)
{
bool result=accountService.CreateAccount(viewModel.User);
如果(!结果)
{
//发送失败信息
}
其他的
{
返回重定向到操作(“列表”);
}
}
返回视图();
}
[HttpGet]
公共行动结果列表()
{
var accounts=accountService.GetAccounts();
var viewModel=new ListViewModel(){Accounts=Accounts};
返回视图(viewModel);
}
}
我的看法是:
@model VDOT.Web.AccountViewModels.CreateViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm("create", "account"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>CreateViewModel</legend>
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.User.Login)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.User.Login)
@Html.ValidationMessageFor(model => model.User.Login)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.User.Password)
@Html.ValidationMessageFor(model => model.User.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.User.FirstName)
@Html.ValidationMessageFor(model => model.User.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.User.LastName)
@Html.ValidationMessageFor(model => model.User.LastName)
</div>
<div class="editor-field">
<select id="paging" onchange="location.href=this.value">
@foreach (var item in Model.Roles)
{
<option value="@Url.Action("create", "account", new { role = item.Id })">
@item.Name
</option>
}
</select>
</div>
<div class="editor-field">
@foreach (var item in Model.User.UserAccesses)
{
@Html.CheckBox(item.Access.Name, item.Value);
<br />
}
</div>
</fieldset>
</fieldset>
<fieldset>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
@model VDOT.Web.AccountViewModels.CreateViewModel
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm(“创建”、“帐户”))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
CreateViewModel
@LabelFor(model=>model.User.Login)
@EditorFor(model=>model.User.Login)
@Html.ValidationMessageFor(model=>model.User.Login)
@LabelFor(model=>model.User.Password)
@EditorFor(model=>model.User.Password)
@Html.ValidationMessageFor(model=>model.User.Password)
@LabelFor(model=>model.User.FirstName)
@EditorFor(model=>model.User.FirstName)
@Html.ValidationMessageFor(model=>model.User.FirstName)
@LabelFor(model=>model.User.LastName)
@EditorFor(model=>model.User.LastName)
@Html.ValidationMessageFor(model=>model.User.LastName)
@foreach(Model.Roles中的var项)
{
@项目名称
}
@foreach(Model.User.useraccess中的var项)
{
@复选框(item.Access.Name、item.Value);
}
}
谢谢你的帮助 我认为您正在寻找一种将用户访问集合绑定到用户视图模型的方法。有了这一点,您的完整模型将在回发时保持不变,允许您在不编写脚本的情况下实现所需的任何功能(尽管您可以使用jQuery(如果可用)来增强页面的“更平滑”功能)
上提供了创建模型列表属性绑定的一个很好的方法。在knockout.js上有一个lool,您可以使用客户端来实现。脚本…这太酷了。。。一个问题是如何将其与ajax控制器操作请求集成?看看Steve Sandersons的博客或淘汰赛网站本身,应该有很多将其与ajax集成的示例,一旦您进入其中,这非常简单,注意:据我所知,您将大量使用JSON,这使得JavaScript处理得非常好,生活变得更加轻松。链接: