是否有可能在视图中构建一个没有魔术字符串的ASP MVC应用程序?

时间:2009-07-12 17:27:45

标签: asp.net-mvc

我是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从会话中提取的,但是阅读起来并不直观。

我担心的是,我将花时间与框架作斗争,以避免魔术字符串,并且在此过程中最终会出现标记,这是一种难以阅读的内容。在人们的经验中这是一个有效的关注,并在网络上有一个参考,其中有一个“魔术字符串方法”到“类型安全方法”查找表?

4 个答案:

答案 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)格式。这是一个解释这个

的链接

http://blogs.lessthandot.com/index.php/WebDev/WebDesignGraphicsStyling/me-and-asp-net-mvc-less-magic-strings

答案 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