[英]How do I add route values to hyperlink?
使用VS2013,MVC5,假设模型中存在主/标题记录以及多个相关详细信息,则MVC视图将在文本框中显示标题数据,并在Web网格中显示详细信息。 控制器具有一个动作方法,该方法接受要显示的标题记录的ID。 没有带空参数列表的操作方法。 当我单击结果/显示的视图的Web网格标题超链接时,出现错误...
参数字典包含“ WebGridTest.Controllers.HomeController”中方法“ System.Web.Mvc.ActionResult Index(Int32)”的非空类型“ System.Int32”的参数“ Id”的空条目。 可选参数必须是引用类型,可为空的类型,或者必须声明为可选参数。 参数名称:参数
这是我的代码...
我的细节
namespace WebGridTest.Models
{
public class MyDetail
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
}
}
我的头
using System.Collections.Generic;
namespace WebGridTest.Models
{
public class MyHeader
{
public MyHeader()
{
this.MyDetails = new List<MyDetail>();
}
public int Id { get; set; }
public List<MyDetail> MyDetails { get; set; }
}
}
家庭控制器
using System.Web.Mvc;
namespace WebGridTest.Controllers
{
public class HomeController : Controller
{
public ActionResult Index(int Id)
{
var model = new Models.MyHeader();
model.Id = 2; // HARD CODED VALUES FOR DEMONSTRATING THIS ISSUE
var detail1 = new Models.MyDetail();
detail1.Column1 = "1A";
detail1.Column2 = "1B";
detail1.Column3 = "1C";
model.MyDetails.Add(detail1);
var detail2 = new Models.MyDetail();
detail2.Column1 = "2A";
detail2.Column2 = "2B";
detail2.Column3 = "2C";
model.MyDetails.Add(detail2);
var detail3 = new Models.MyDetail();
detail3.Column1 = "3A";
detail3.Column2 = "3B";
detail3.Column3 = "3C";
model.MyDetails.Add(detail3);
return View(viewName: "Index", model: model);
}
}
}
Index.cshtml
@model WebGridTest.Models.MyHeader
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm(actionName: "Index", controllerName: "Home", method: FormMethod.Post))
{
<p></p>
@Html.TextBoxFor(x => x.Id)
<p></p>
WebGrid grid = new WebGrid(null, canPage: false);
grid.Bind(Model.MyDetails);
@grid.GetHtml(tableStyle: "table table-bordered lookup-table", columns:
grid.Columns(
grid.Column(
"Column1"
, "Column 1"
, (item) => (item.Column1)
)
,
grid.Column(
"Column2"
, "Column 2"
, (item) => (item.Column2)
)
,
grid.Column(
"Column3"
, "Column 3"
, (item) => (item.Column3)
)
)
)
}
当我运行项目时,我收到上述错误。 如果我从操作方法“索引”中删除参数,程序将不会产生错误。
将鼠标悬停在网页的标题上时,会看到生成的URL。 我可以看到它在查询字符串参数列表中不包含路由值。 它仅包含排序值。 例...
http:// localhost:62802 / Home / Index?sort = Column1&sortdir = ASC
我的示例是人为的且琐碎的,但足以说,我需要ID来标识要显示的记录。
如何在列标题上指定ID路由值?
在网上进行研究后,许多开发人员建议使用JavaScript修改DOM以包含路由值。 这似乎可行,但实际上已脱离MVC结构,转而支持客户端评估和操作。 该信息在IIS / MVC中可用,但是缺乏应用该信息(特别是应用于Web网格标题锚)的功能。
我找到了JavaScript的替代方法,可以将解决方案完全保留在C#中。 我将以问答形式回答我自己的问题。
该解决方案涉及创建一个扩展方法,该方法将在响应原始客户端请求之前将路由值注入到生成的HTML中。 这需要添加扩展方法类,并在视图中添加方法调用。
例...
扩展方法类
using System.Web;
namespace WebGridTest
{
public static class ExtensionMethods
{
public static IHtmlString AddRouteValuesToWebGridHeaders(this IHtmlString grid, string routeValues)
{
var regularString = grid.ToString();
regularString = regularString.Replace("?sort=", "?" + routeValues + "&sort=");
HtmlString htmlString = new HtmlString(regularString);
return htmlString;
}
}
}
增强视图
(注意调用扩展方法“ AddRouteValuesToWebGridHeaders”)...
@model WebGridTest.Models.MyHeader
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm(actionName: "Index", controllerName: "Home", method: FormMethod.Post))
{
<p></p>
@Html.TextBoxFor(x => x.Id)
<p></p>
WebGrid grid = new WebGrid(null, canPage: false);
grid.Bind(Model.MyDetails);
@grid.GetHtml(tableStyle: "table table-bordered lookup-table", columns:
grid.Columns(
grid.Column(
"Column1"
, "Column 1"
, (item) => (item.Column1)
)
,
grid.Column(
"Column2"
, "Column 2"
, (item) => (item.Column2)
)
,
grid.Column(
"Column3"
, "Column 3"
, (item) => (item.Column3)
)
)
).AddRouteValuesToWebGridHeaders("Id=" + Model.Id.ToString())
}
注入HTML并不是首选的解决方案,因为与其他任何解析算法一样,它也是高度假定的。 除了HTML解析之外,我没有找到其他方法。 也许下载此类的Microsoft开源版本并创建具有所需行为的替代将是一个更优雅的解决方案。
**请求**-Microsoft-请在Web网格标题渲染中添加控制/增强锚点的功能。
请随意发表评论...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.