我是ASP .Net MVC的新手,我上周从Apress购买了Pro ASP .Net MVC Framework书,这证明非常有帮助。
我到目前为止看到的问题是,几乎所有的示例视图都充斥着神奇的字符串。我已经设法通过并找出了一些替代方案,但代码开始变得有点难以阅读。例如:
<% using(Html.BeginForm("RemoveFromCart", "Cart")){ %>
<%= Html.Hidden("ProductID", line.Product.ProductID) %>
<%= Html.Hidden("returnUrl", ViewData["returnRrl"]) %>
<input type="submit" value="Remove" />
<% } %>
变为:
<% using (Html.BeginForm<CartController>(c => c.RemoveFromCart(null, line.Product.ProductID, (string)ViewData["returnUrl"]))) { %>
<input type="submit" value="Remove" />
<% } %>
我可以放弃这个示例,因为RemoveFromCart
的第一个参数是通过ModelBinder
从会话中提取的,但是阅读起来并不直观。
我担心的是,我将花时间与框架作斗争,以避免魔术字符串,并且在此过程中最终会出现标记,这是一种难以阅读的内容。在人们的经验中这是一个有效的关注,并在网络上有一个参考,其中有一个“魔术字符串方法”到“类型安全方法”查找表?
答案 0 :(得分:6)
通过使用T4MVC和MVC Futures,您可以轻松消除99%的魔术字符串。
这两个项目均可从http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471
获得T4MVC将处理控制器,操作和路由,而期货内容具有强类型的HTML帮助程序。 MVCContrib项目是另一个需要关注的项目,因为它包含一些强类型的流畅HTML构建器。
答案 1 :(得分:4)
我感兴趣地阅读了LosTechies的这篇博文:
A new breed of magic strings in ASP.NET MVC
他们建议改变这个:
Url.Action<ProductsController>(x => x.Edit(null), new { productId = prodId })
包含魔术字符串productID,对此:
Url.Action<ProductsController>(x => x.Edit(null),
new RouteValueDictionary { { ProductsController.ProductId, prodId } })
ProductId现在是强类型的。
或者您可以创建一个真实对象而不是匿名对象:
Url.Action<ProductsController>(x => x.Edit(null),
new EditProductParams { product = prodId })
但现在你需要这个:
public class EditProductParams
{
public Guid product { get; set; }
}
他们最后的建议是使用流畅的界面。你可以这样写:
Url.Action<ProductsController>(x => x.Edit(null, null),
Params.Product(product).Customer(customer))
看起来很干净(如果有点多余),但需要这样:
public static class Params
{
public static ParamBuilder Product(Product product)
{
var builder = new ParamBuilder();
return builder.Product(product);
}
public static ParamBuilder Customer(Customer customer)
{
var builder = new ParamBuilder();
return builder.Customer(customer);
}
}
......而且这个:
public class ParamBuilder
{
private Product _product;
private Customer _customer;
public ParamBuilder Product(Product product)
{
_product = product;
return this;
}
public ParamBuilder Customer(Customer customer)
{
_customer = customer;
return this;
}
}
......而且这个:
public static implicit operator RouteValueDictionary(ParamBuilder paramBuilder)
{
var values = new Dictionary<string, object>();
if (paramBuilder._product != null)
{
values.Add("p", paramBuilder._product.Id);
}
if (paramBuilder._product != null)
{
values.Add("c", paramBuilder._customer.Id);
}
return new RouteValueDictionary(values);
}
如果可以使用泛型编写,我可以看到这个工作,所以它只需要写一次。
答案 2 :(得分:1)
我想您可能已经知道这一点,但我们当然可以创建强类型的视图,这将允许我们在视图中使用Html.Encode(Model.PropertyName)格式。这是一个解释这个
的链接答案 3 :(得分:0)
我强烈推荐这篇文章 - 它很简短,并以非常清晰的方式总结了所有基础知识。它是由Scott Guthrie编写的,他是MS MV中的.NET MVC PM:http://weblogs.asp.net/scottgu/archive/2009/04/28/free-asp-net-mvc-nerddinner-tutorial-now-in-html.aspx