C# 如何将管线值添加到超链接?
使用VS2013、MVC5,假设模型中存在主/标题记录和多个相关细节,MVC视图将在文本框中显示标题数据,并在web网格中显示细节。控制器有一个操作方法,该方法接受要显示的标题记录的id。没有参数列表为空的操作方法。当我单击结果/显示视图的web网格标题超链接时,我收到一个错误 参数字典包含的参数“Id”为空 方法的不可为Null的类型“System.Int32” 中的“System.Web.Mvc.ActionResult索引(Int32)” “WebGridTest.Controllers.HomeController”。必须提供可选参数 可以是引用类型、可为null的类型,也可以声明为可选类型 参数参数名称:参数 这是我的密码 代码 模型 MyDetailC# 如何将管线值添加到超链接?,c#,asp.net-mvc,webgrid,C#,Asp.net Mvc,Webgrid,使用VS2013、MVC5,假设模型中存在主/标题记录和多个相关细节,MVC视图将在文本框中显示标题数据,并在web网格中显示细节。控制器有一个操作方法,该方法接受要显示的标题记录的id。没有参数列表为空的操作方法。当我单击结果/显示视图的web网格标题超链接时,我收到一个错误 参数字典包含的参数“Id”为空 方法的不可为Null的类型“System.Int32” 中的“System.Web.Mvc.ActionResult索引(Int32)” “WebGridTest.Controllers.
namespace WebGridTest.Models
{
public class MyDetail
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
}
}
@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)
)
)
)
}
MyHeader
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
namespace WebGridTest.Models
{
public class MyDetail
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
}
}
@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)
)
)
)
}
@model WebGridTest.Models.MyHeader
@{
ViewBag.Title=“主页”;
}
@使用(Html.BeginForm(actionName:“Index”,controllerName:“Home”,method:FormMethod.Post))
{
@Html.TextBoxFor(x=>x.Id)
WebGrid=newwebgrid(null,canPage:false);
grid.Bind(Model.MyDetails);
@GetHtml(tableStyle:“表格边框查找表格”,列:
网格.列(
网格.柱(
“第1栏”
,“第1栏”
,(项目)=>(第1列项目)
)
,
网格.柱(
“第2栏”
,“第2栏”
,(项目)=>(第2列项目)
)
,
网格.柱(
“第3栏”
,“第3栏”
,(项目)=>(第3列项目)
)
)
)
}
当我运行项目时,我收到上面描述的错误。如果我从操作方法“Index”中删除参数,程序将不会生成错误
当我将鼠标悬停在网页的标题上时,我会看到生成的URL。我可以看到它没有在查询字符串参数列表中包含路由值。它只包括排序值。例如
我的示例是精心设计的,非常琐碎,但我需要Id来标识要显示的记录
如何在列标题上指定id路由值?在web上进行研究后,许多开发人员建议使用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=“主页”;
}
@使用(Html.BeginForm(actionName:“Index”,controllerName:“Home”,method:FormMethod.Post))
{
@Html.TextBoxFor(x=>x.Id)
WebGrid=newwebgrid(null,canPage:false);
grid.Bind(Model.MyDetails);
@GetHtml(tableStyle:“表格边框查找表格”,列:
网格.列(
网格.柱(
“第1栏”
,“第1栏”
,(项目)=>(第1列项目)
)
,
网格.柱(
“第2栏”
,“第2栏”
,(项目)=>(第2列项目)
)
,
网格.柱(
“第3栏”
,“第3栏”
,(项目)=>(第3列项目)
)
)
).AddRouteValuesToWebGridHeaders(“Id=“+Model.Id.ToString())
}
结论
注入HTML不是首选的解决方案,因为与其他解析算法一样,它具有高度的假设性。除了HTML解析,我没有找到其他方法。也许下载该类的Microsoft开源版本并创建具有所需行为的覆盖将是一个更优雅的解决方案
**请求**-Microsoft-请在web网格标头渲染中添加控制/增强锚的功能
请随意评论