如何将通用参数传递给部分视图

3

可能重复:
通用部分视图:如何将通用类设置为模型?

我正在尝试使用通用类型构建常见功能,但在以下场景中遇到了困难。

视图模型

public class DeleteForm<T>  
{
    public LogInfo Ticket { get; set; }
    public string Id { get; set; }

    public DeleteForm() {
      Ticket = new LogInfo();
    }

    public DeleteForm(T viewModel) : this() {
      ViewModel = viewModel;
    }

    public T ViewModel { get; set; }
}

控制器

public ActionResult Index(string name)
{
   return View("index", new DeleteForm<List<Users>>(new List<Users>());
}

列表屏幕
@model DeleteForm<List<Users>>
//gridview displays list of users
@Html.Partial("revisionwindow", Model)

局部视图

@model DeleteForm<T> <---Its not working

@Html.EditorFor(o=>o.Ticket)
@Html.EditorFor(o=>o.Id)

我尝试通过传递对象和动态方式,但似乎不起作用。例如:@Html.Partial("revisionwindow", (object) Model),但在部分视图中,我无法将其强制转换回DeleteForm<T>。 - Nikhil
我也尝试使用接口,但在发布的链接中,接口包含独立属性。但在我的情况下,我需要根据特定类型即T来初始化列表。 - Nikhil
2个回答

6

使用动态模型替代。您的局部视图可以如下所示:

@model dynamic

 @{
      var myModel = (DeleteForm<List<Users>>) Model;
 }

@Html.EditorFor(o=>myModel.Ticket)
@Html.EditorFor(o=>myModel.Id)

希望这可以帮助您。

我正在尝试使用通用类型替换List<Users>,以便它可以在所有模块中通用。T可以是列表或其他包含列表的自定义视图模型。所以var myModel = (DeleteForm<List<Users>>) Model,在我的情况下不起作用。相反,应该是(DeleteForm<T>) Model; 这会导致错误。 - Nikhil

1
如果您将一个模型传递给视图,它必须是强类型(特定类型)的。因此,SomeClass<T> 类型不起作用。代替泛型类型,可以使用基类来满足您的要求。我的意思是:视图模型。
public abstract class Form
{
    public Form()
    {
        Ticket = new LogInfo();
    }
    public LogInfo Ticket {get; set;}
    public int Id {get; set;}
}
public class DeleteUsersForm: Form
{
    public DeleteUsersForm(IEnumerable<Users> users):base()
    {
        this.ViewModel = users;
    }

    public IEnumerable<Users> ViewModel {get; set;}
}

控制器

public ActionResult Index(string name)
{
    return View(new DeleteUsersForm(new List<Users>()));
}

列表屏幕

@model DeleteUsersForm
//displays list
@Html.Partial("revisionwindow", Model)

局部视图

@model Form

@Html.EditorFor(o=>o.Ticket)
@Html.EditorFor(o=>o.Id)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接