C# 如何在WebGrid razor asp NETMVC4中使用绑定到模型的DropDownList?

C# 如何在WebGrid razor asp NETMVC4中使用绑定到模型的DropDownList?,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,在谷歌搜索了几个小时并尝试了不同的语法之后,我决定发布这篇文章。问题是我无法找到在webgrid中使用DropDownList的正确方法。考虑下面的模型: public class UsuariosModel { public int UserId { get; set; } public string UserName { get; set; } public string Nombres { get; set; } public string Apellido

在谷歌搜索了几个小时并尝试了不同的语法之后,我决定发布这篇文章。问题是我无法找到在webgrid中使用DropDownList的正确方法。考虑下面的模型:

public class UsuariosModel
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Nombres { get; set; }
    public string ApellidoPaterno { get; set; }
    public string ApellidoMaterno { get; set; }
    public string Titulo { get; set; }
    public string Telefono { get; set; }
    public string Email { get; set; }
    public bool Activo { get; set; }
    public string[] Roles { get; set; }
    public List<SelectListItem> TodosLosRoles { get; set; }
}
公共类UsuariosModel
{
public int UserId{get;set;}
公共字符串用户名{get;set;}
公共字符串名称{get;set;}
公共字符串apellidopterno{get;set;}
公共字符串ApellidoMaterno{get;set;}
公共字符串Titulo{get;set;}
公共字符串Telefono{get;set;}
公共字符串电子邮件{get;set;}
公共bool Activo{get;set;}
公共字符串[]角色{get;set;}
ToDosOsRoles的公共列表{get;set;}
}
控制员:

 public ActionResult UsuariosRoles()
    {
        List<Models.UsuariosModel> model = new Metodos.Entidades().listaUsuarios();
        if (model != null)
        {
            var roles = (SimpleRoleProvider)Roles.Provider;
            var allRoles = roles.GetAllRoles().Select(x => new SelectListItem{
              Text = x, 
              Value = x
            }).ToList<SelectListItem>();
            foreach (UsuariosModel md in model)
            {
                md.Roles = roles.GetRolesForUser(md.UserName);
                md.TodosLosRoles = allRoles;

            }

            return View(model);
        }
        else
        {
            return new EmptyResult();
        }
    }
public ActionResult UsuariosRoles()
{
列表模型=new Metodos.Entidades().listaUsuarios();
如果(型号!=null)
{
var roles=(SimpleRoleProvider)roles.Provider;
var allRoles=roles.GetAllRoles().Select(x=>newselectListItem{
Text=x,
值=x
}).ToList();
foreach(通常为模型中的模型md)
{
md.Roles=Roles.GetRolesForUser(md.UserName);
md.TodosLosRoles=所有角色;
}
返回视图(模型);
}
其他的
{
返回新的EmptyResult();
}
}
以及以下观点:

@model List<MvcCursosSSP.Models.UsuariosModel>

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "Roles de los Usuarios -Administración-";
    var grid = new WebGrid(source: Model);

    }

<h2>Asignar roles a usuarios</h2>
@using (Html.BeginForm()) {

@grid.GetHtml(
columns:grid.Columns(
grid.Column("UserId", "Id de Usuario"),
grid.Column("UserName", "Nombre de Usuario"),
grid.Column("Nombres", "Nombre(s)"),
grid.Column("Titulo", "Título"),
grid.Column("ApellidoPaterno", "Apellido Paterno"),
grid.Column("ApellidoMaterno", "Apellido Materno"),
grid.Column("Telefono", "Teléfono"),
grid.Column("Email", "Email"),
grid.Column("TodosLosRoles", "Roles", format:(item)=>Html.DropDownList(item.UserId, Model[0].TodosLosRoles.Select(u => new SelectListItem{Text= u.Text, Value=u.Value}))),
headerStyle:"headerActivate",
rowStyle:"rowActivate",
selectedRowStyle:"selectedActivate"))

<input type="submit" value="Guardar cambios" />
}
@型号列表
@{
Layout=“~/Views/Shared/_Layout.cshtml”;
ViewBag.Title=“通常情况下的角色-管理者-”;
var grid=新的WebGrid(来源:模型);
}
通常情况下,亚洲的角色
@使用(Html.BeginForm()){
@grid.GetHtml(
列:grid.columns(
grid.Column(“UserId”、“Id de Usuario”),
网格列(“用户名”、“名称”),
网格栏(“Nombre”、“Nombre(s)”),
网格柱(“提图罗”、“蒂图罗”),
网格栏(“阿佩利多帕特诺”、“阿佩利多帕特诺”),
网格柱(“ApellidoMaterno”、“Apellido Materno”),
网格柱(“Telefono”、“Teléfono”),
网格栏(“电子邮件”、“电子邮件”),
grid.Column(“TodosLosRoles”,“Roles”,格式:(item)=>Html.DropDownList(item.UserId,Model[0]。TodosLosRoles.Select(u=>new SelectListItem{Text=u.Text,Value=u.Value})),
headerStyle:“headerActivate”,
rowStyle:“rowActivate”,
selectedRowStyle:“selectedActivate”))
}
在这一行:
grid.Column(“TodosLosRoles”,“Roles”,format:(item)=>Html.DropDownList(item.UserId,Model[0]。TodosLosRoles.Select(u=>new-SelectListItem{Text=u.Text,Value=u.Value})),

我无法消除错误:“CS1973:'System.Web.Mvc.HtmlHelper没有名为DropDownList的适用方法,但似乎有一个名为DropDownList的扩展方法。扩展方法无法自动调度”

但是我已经读了很多关于这个错误的书,我不明白为什么我一直在读它。毕竟我已经将DropDownList格式化为SelectListItems,不是吗

请帮帮我,我对此很恼火

更新

我也试过:
grid.Column(“TodosLosRoles”,“Roles”,format:(item)=>Html.DropDownList(item.UserId,(List)item.TodosLosRoles)),

但是我一直都会遇到错误,所以有人能告诉我为什么即使对原始类型进行强制转换也无法修复它,错误清楚地表明:

考虑在不使用扩展方法语法的情况下强制转换动态参数或调用扩展方法


那么,如何将其称为“没有扩展方法语法”?

请尝试以下格式:

grid.Column(
    "TodosLosRoles", 
    "Roles", 
    format: item => Html.DropDownList(((int)item.UserId).ToString(), Model[0].TodosLosRoles)
)

这有点垃圾,但是
WebGrid
通常都是垃圾。它依赖于弱动态类型,如果依赖于此组件,您可能会忘记强类型和适当的视图模型。如果您对所传递的类型不十分小心,请准备将其转换为地狱,并防止潜在的运行时错误。

谢谢!成功了!令人难以置信的是,我一直在担心第二个参数而不关心第一个参数。我不知道我必须处理所有的细节!猜测模型->控制器->视图并不像看上去那么简单。我也不想指出,作为记录,我在css格式方面也遇到了问题。例如:
headerStyle:“headerActivate”,rowStyle:“rowActivate”//这一行在添加下一行之前无法正常工作,而下一行的替代行则是rowStyle:“altActivate”,selectedRowStyle:“selectedActivate”)
,这可能是WebGrid控件的另一个问题您好!我想知道,考虑到你对razor的智慧,你是否还可以帮我使用以下语法。我想在同一个WebGrid中添加另一个列,我可以这样做:
grid.column(“角色”,“角色实际值”,格式:item=>Html.DisplayName(String.Join(“,”,(String[])item.Roles)),
,但是我不能用以下方式来做:
grid.column(“角色”,“角色实际值”,格式:item=>Html.DisplayName(@)((String[]))item.Roles).Count()>1?String.Join(“,”,item.Roles):(String[])item.Roles[0]),
我想知道你是否能告诉我第二个有什么问题我想用最后一种方法(代码不起作用)因为当列表中只有一个角色时,我不想显示任何尾随逗号。不过,我看到字符串中没有添加尾随逗号。无论如何,连接是旧线程,但我有一个问题,你说webgrid不好。那么MVC中大多数人使用的网格是什么?你能给我一个好的网格名称,我们可以在MVC项目a中使用它吗这是您的喜好。谢谢