Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将管线值添加到超链接?_C#_Asp.net Mvc_Webgrid - Fatal编程技术网

C# 如何将管线值添加到超链接?

C# 如何将管线值添加到超链接?,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.

使用VS2013、MVC5,假设模型中存在主/标题记录和多个相关细节,MVC视图将在文本框中显示标题数据,并在web网格中显示细节。控制器有一个操作方法,该方法接受要显示的标题记录的id。没有参数列表为空的操作方法。当我单击结果/显示视图的web网格标题超链接时,我收到一个错误

参数字典包含的参数“Id”为空 方法的不可为Null的类型“System.Int32” 中的“System.Web.Mvc.ActionResult索引(Int32)” “WebGridTest.Controllers.HomeController”。必须提供可选参数 可以是引用类型、可为null的类型,也可以声明为可选类型 参数参数名称:参数

这是我的密码

代码 模型 MyDetail

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网格标头渲染中添加控制/增强锚的功能

请随意评论