Jquery ASP.NET MVC 3-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

我被困在ViewModel绑定和刷新场景中

情景: 作为管理员,我希望创建用户帐户,并根据DropDownList刷新表单中的选定角色,通过复选框选择与角色连接的特定访问(bool)

所以用户可以有一个具有默认访问列表的角色,管理员可以在创建帐户时修改该列表

我的ViewModel:

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重新填充它

我的问题是:

  • 在没有jQuery的情况下可以做到这一点吗?你的意见是什么
  • 如果可以在没有jQuery的情况下刷新表单,如何在不丢失管理员输入的绑定值的情况下发布表单? 在这里,我不能添加其他@BeginForm,因为我将丢失实际的数据上下文,对吗
  • 若jQuery是唯一的解决方案,那个么如何编写检查jQuery筛选的控制器操作
  • jQuery函数如何替换绑定到ViewModel复选框
  • 我的当前控制器操作:

    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处理得非常好,生活变得更加轻松。链接: