我正在使用新的MVC3 WebGrid.到目前为止一直很好,只是有问题样式/格式化列标题.我得到的最好的解决方法是将同一个css类从WebGrid的第一行应用到表头.
var headerCells = $("#grid tr:eq(0) th");
var firstRowCells = $("#grid tr:eq(1) td");
$.each(firstRowCells, function (index, value) {
$(headerCells[index]).addClass($(firstRowCells[index]).attr("class"));
});
Run Code Online (Sandbox Code Playgroud)
此示例显然缺少检查以确保存在行或确实指定的元素id,但它将第一行中的css类应用于标题行,这意味着您可以相互独立地设置样式.
td.my-column-style { width:100px }
th.my-column-style { text-align:right;}
Run Code Online (Sandbox Code Playgroud)
是否有内置的样式列标题元素的方式(不只是使用headerStyle属性)?
我试图在ASP.NET MVC3中使用新的WebGrid,并且我想要显示一组链接图标,执行各种操作(编辑,查看,删除)...为此,我有一个HtmlHelper扩展,基本上输出HTML:
<a href="" title=""><img alt="" src="" /></a>
Run Code Online (Sandbox Code Playgroud)
扩展返回MvcHtmlString,它在Razor视图中单独使用时工作正常.Eg:@ Html.ActionLinkIconForEditAction("Customer",2)
问题是我需要在传递对象的ID时在WebGrid列中调用此帮助程序(每个操作一次).我难以理解的问题是编译器给我一个错误,说它不能将MvcHtmlString(或'lambda expression'取决于我尝试的调用)转换为格式预期的System.Func ...
例如,这有效:
grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", 2)</text>)
Run Code Online (Sandbox Code Playgroud)
但这不是:
grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", customer.Id)</text>)
grid.Column(header: "", format: (customer) => Html.ActionLinkIconForEditAction("Customer", customer.Id))
Run Code Online (Sandbox Code Playgroud)
我明白了:
Error 4 Argument 3: cannot convert from 'lambda expression' to 'System.Func<dynamic,object>'
Run Code Online (Sandbox Code Playgroud)
或者这个电话:
grid.Column(header: "", format: Html.ActionLinkIconForEditAction("Customer", customer.Id)),
Run Code Online (Sandbox Code Playgroud)
我明白了:
Error 5 Argument 3: cannot convert from 'System.Web.Mvc.MvcHtmlString' to 'System.Func<dynamic,object>'
Run Code Online (Sandbox Code Playgroud)
有什么奇怪我有其他列使用lambdas,直接Model.Property访问器,甚至从String.Format("")输出...它们都工作正常...我读了Func上的所有文档和这个线程也是如此,还是不能弄清楚:)
谁能发现我做错了什么?
我一直试图改变WebGrid中单个列的格式而没有太大的成功.所说的专栏是这样的:
grid.Column(
columnName: "EmailAddress",
header: "Email Address",
format:(item) => Html.EmailLink(item.EmailAddress, item.EmailAddress, ""),
canSort: false
),
Run Code Online (Sandbox Code Playgroud)
错误是:
'System.Web.Helpers.WebGrid.Column(string,string,System.Func,string,bool)'的最佳重载方法匹配有一些无效的参数
我很困惑,因为方法签名匹配.此外,如果我将列更改为下面,那么它的工作没有任何错误:
grid.Column(
columnName: "EmailAddress",
header: "Email Address",
format:(item) => new HtmlString(String.Format("<a href=\"mailto:{0}\" class=\"{2}\">{1}</a>", item.EmailAddress, item.EmailAddress, "")),
canSort: false
),
Run Code Online (Sandbox Code Playgroud)
供参考,EmailLink是一种非常基本的HtmlHelper扩展方法:
public static IHtmlString EmailLink(this HtmlHelper helper, string emailAddress, string linkText, string linkClass) {
return new HtmlString(String.Format("<a href=\"mailto:{0}\" class=\"{2}\">{1}</a>", emailAddress, linkText, linkClass));
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里的问题是什么,以及我如何解决它?
下面的代码将动作链接插入其中一个Web网格列.
@{
View.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
var usersGrid = new WebGrid(source: Model,
rowsPerPage: 40);
}
@usersGrid.GetHtml(
tableStyle: "grid",
headerStyle: "head",
alternatingRowStyle: "alt",
columns: usersGrid.Columns(
usersGrid.Column(format: (item) =>
Html.ActionLink("Edit", "Edit", new { id = item.Id})),
usersGrid.Column("Surname")
)
)
Run Code Online (Sandbox Code Playgroud)
但如果我为此交换该行:
usersGrid.Column(format: (item) => Html.CheckBox(item.Id)),
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
错误4'System.Web.Helpers.WebGrid.Column(string,string,System.Func,string,bool)'的最佳重载方法匹配具有一些无效参数.
我不太明白两者之间的区别..为什么一个工作而另一个错误?
最终目标是能够勾选多个复选框,然后发送打印信息.
我正在努力学习Asp.net mvc.我知道它与形式不同,我需要改变我的思维方式.我的问题是关于webgrid.当我将webgrid添加到我的页面并点击搜索按钮时,使用Postr呈现带有寻呼机的表格,依此类推.但寻呼机上的链接不是张贴形式,它们只是链接,我丢失了所有表格的数据.
Controller有两种索引方法,一种是get,另一种是post.为了让我什么都不做,我只是在这种情况下创建新的viewmodel Search类并将其设置为view.对于我的post方法,我抓住我的视图模型进行搜索并设置填充的viewmodel进行查看.
问题:webgrid将寻呼机呈现为链接,因此它将进入索引获取,但因为它不是一个帖子请求我没有填写任何表单字段,我的搜索将不提供相同的结果集.
也许示例代码可以更好地解释它.
视图:
<form action="" method="post">
Esas no : @Html.TextBoxFor(x=>x.Name)
Yil : @Html.TextBoxFor(x=>x.Year)
<input type="submit" value="Search" />
<hr />
@ViewBag.Message
<hr />
@{ var grid = new WebGrid(Model.Results,rowsPerPage:5);}
@grid.GetHtml(tableStyle:"table",htmlAttributes:new {id="tbl"} )
</form>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:搜索在Index Post方法中发生,它只有我的viewmodel类.
private ISearchContext _sc;
public MyController(ISearchContext sc)
{
_dc = dc;
}
//
// GET: /Dava/
public ActionResult Index()
{
var search = new Search();
ViewBag.Message = "";
return View(search);
}
[HttpPost]
public ActionResult Index(Search search)
{
Search sres = _dc.SearchFromRepository(search);
ViewBag.Message = …Run Code Online (Sandbox Code Playgroud) 在我的webgrid中,我需要根据值显示图像.代码如下
@model TraktorumMVC.Models.ManagePhotos
@{
ViewBag.Title = "ManagePhotos";
Layout = "~/Views/Shared/_Layout.cshtml";
var grid = new WebGrid(Model.AdPhotos);
}
@grid.GetHtml(
displayHeader: false,
columns: grid.Columns(
grid.Column(format: (item) =>
{
if (item.IsMainPreview == true)
{
return @<text><img src="@Url.Content("~/Content/images/preview-photo.gif")" alt="Image "/></text>;
}
else
{
return @<text><img src="@Url.Content("~/Content/images/non-preview-photo.gif")" alt="Image "/></text>;
}
}
),
grid.Column(format: (item) => Html.ActionLink("Remove Photo", "RemovePhoto", "Images", new { photoID = @item.Id }, new { @class = "RemovePhoto" }))
));
Run Code Online (Sandbox Code Playgroud)
我不确定如何if在webgrid中使用.我只是尝试过.它不工作.忘记跟随错误
The best overloaded method match for 'System.Web.Helpers.WebGrid.Column(string, string, System.Func<dynamic,object>, string, bool)' …Run Code Online (Sandbox Code Playgroud) 我可以在任何控制器中使用WebGrid,例如:
var grid = new WebGrid(emailsFetched, columnNames);
我必须在我的ASP.NET MVC项目中添加一个引用System.Web.Helpers.
但是当我尝试直接在视图中使用这个网格时(为了避免控制器中的实例化和其他设置),它说:The type or namespace 'WebGrid' cannot be found.好的,我也尝试在这里添加一个引用:
@using System.Web.Helpers 但这引发了另一个问题:
There is no build provider registered for the extension '.cshtml'. You can register one in the <compilation><buildProviders> section in the machine.config or web.config. Make sure is has a BuildProviderAppliesToAttribute attribute which includes the value 'Web' or 'All'.
这很奇怪......我在网上看到了足够的例子,它们正在使用WebGrid并且不必在cshtml视图中声明任何内容......
你能告诉我怎么解决这个问题吗?或者为什么我遇到这个非常丑陋的问题?
我在System.Web.Helpers.WebGrid整个应用程序中广泛使用,并且在大多数情况下它很好,实际上在本地运行它总是很好或在服务器上使用自我SSL它也很好.所以我不知道问题是否真的可以用于IIS或防火墙,或实际的网格,或者我需要做些什么来修复它.
在所有浏览器上,虽然结果略有不同,但WebGrid上的连续ajax排序和分页会导致它挂起,当我在Fiddler中检查响应时,我得到
[Fiddler]
ReadResponse()失败:服务器未返回此请求的响应.
如果我将网址直接复制并粘贴到浏览器中,它会加载,但是如果我不断点击F5,我最终会收到一条消息,指出Chrome中的"此网页不可用"(带错误103 ERR_CONNECTION_ABORTED)或"Internet Explorer无法显示网页" IE浏览器.
网址很长很复杂,就像这样 http://app.myapp.com/mygrid/9e3b2ae5-cbe1-4a4a-a355-a14f00d26e24?mylayout=true&myid=634982439599769687&readonly=False&search=-&__=634982439708207187&sort=Name&dir=ASC
如果在服务器上安装了SSL证书,这个问题似乎就会消失,并且本地不会发生.
有任何想法吗?
在我的页面上,我有两个webGrids.当我单击一个对该列进行排序时,两个网格都在该列上排序.对仅在一个列中的列进行排序,根本不排序.
我注意到排序的工作原理是使标题成为同一页面的链接,在查询字符串中包含列和方向.这解释了两个网格都受到影响.我想知道webGrid是否有一些功能来解决我的问题,或者我应该自己修复它.
我计划"自己修复"的方法是首先通过设置htmlAttributes为表标记添加id属性.然后我将使用jQuery为每个webgrid找到这个id,并将该id包含在links参数中.然后当加载带有网格的页面时,我将根据这些参数强制设置要排序的列.
在我看来,webGrid不是设计在与另一个webGrid的页面上.但是,我觉得在我的情况下,这是需要的.我更喜欢使用一些标准方式(内置或其他人使用).
所以问题是,最好的方法是什么?如果没有最好的方法,我的方式是一个好方法(我忘记了什么)?
提前致谢.
如果您想知道如何制作多个复选框和多个复选框选择(选择全部或取消全选),分页,在MVC3 Webgrid中排序,这里是解决方案:
要简化,它具有以下功能:
视图:
@using NameSpace.DataAccess
@using ThisController = NameSpace.Web.Controllers.HomeController
@model GenericModelTypes<ContactModel>
@{var grid = new WebGrid(rowsPerPage: ThisController._pageSize,
canPage: true, canSort: true, ajaxUpdateContainerId: "webgrid");
grid.Bind(Model.TypeList, rowCount:Model.TotalRecordCount,autoSortAndPage: false);
grid.Pager(WebGridPagerModes.All);
@grid.GetHtml(
tableStyle: "webgrid",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style",
htmlAttributes: new { id = "webgrid" },
columns: grid.Columns(
grid.Column(header: "Assign?", style: "labelcolumn",
format:
@<text><input class="check-box" id="assignChkBx" name="assignChkBx" type="checkbox" value="@item.ContactId" /></text>),
grid.Column("CompanyName", "Company Name"),
grid.Column("Title", "Title"),
grid.Column("FirstName", "First Name"),
grid.Column("LastName", "Last Name"),
grid.Column("Street", "Street"),
grid.Column("City", …Run Code Online (Sandbox Code Playgroud)