Можно ли построить приложение ASP MVC без волшебных строк в представлениях? - PullRequest
7 голосов
/ 12 июля 2009

Я очень новичок в ASP .Net MVC, я купил книгу Pro ASP .Net MVC Framework от Apress на прошлой неделе, и она оказывается очень полезной.

Проблема, которую я вижу до сих пор, состоит в том, что почти все примеры примеров пронизаны волшебными строками. Мне удалось пройти и выяснить несколько альтернатив, но код начинает становиться довольно сложным для чтения. Например:

<% 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 ]

6 голосов
/ 12 июля 2009

Используя T4MVC и MVC Futures, вы можете легко устранить 99% магических струн.

Оба эти проекта доступны с http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

T4MVC позаботится о контроллерах, действиях и маршрутизации, в то время как у фьючерсов есть строго типизированные помощники HTML. Проект MVCContrib - это еще один проект, на который стоит обратить внимание, так как он включает в себя строго типизированных беглых компоновщиков HTML.

4 голосов
/ 12 июля 2009

Я с интересом прочитал это сообщение в блоге от LosTechies:
Новое поколение волшебных струн в 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);
}

Я мог бы увидеть, как это работает, если бы он мог быть написан с использованием шаблонов, так что его нужно было бы написать только один раз.

1 голос
/ 12 июля 2009

Я думаю, что вы, возможно, уже знаете это, но мы, безусловно, можем создать строго типизированные представления, которые позволили бы нам использовать формат Html.Encode (Model.PropertyName) в представлении. Вот ссылка, которая объясняет это

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

0 голосов
/ 13 июля 2009

Я очень рекомендую это прочтение - оно короткое и вкратце обобщает все основы. Это было написано Скоттом Гатри, который является .NET MVC PM среди прочего в MS: http://weblogs.asp.net/scottgu/archive/2009/04/28/free-asp-net-mvc-nerddinner-tutorial-now-in-html.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...