与一组具有可伸缩属性的模型共享一个Razor Create视图



在使用Razor的MVC c# Web应用程序中,我经常想要重用View代码来创建操作。

想象一下这个场景:

public class Taco 
{
    public Lunch Lunch { get; set; }
    public Supper Supper { get; set; }
    public string Cheese { get; set; }
}
public class Lunch 
{
    public IEnumerable<Taco> Taco { get; set; }
}
public class Supper 
{
    public IEnumerable<Taco> Taco { get; set; }
}

你的午餐和晚餐有玉米饼。

现在看这两个用例:

  • From Supper's Details View

    1. 想添加一个Taco

    2. 点击"Create New Taco"

    3. 输入Taco信息

    4. 点击"创建"按钮

    5. 重定向到晚餐细节与新的Taco那里

  • From Lunch's Details View

    1. 想添加一个Taco

    2. 点击"Create New Taco"

    3. 输入Taco信息

    4. 点击"创建"按钮

    5. 重定向到午餐详情与新的Taco那里

什么是可扩展和mvc正确的方法来做到这一点?

我一直觉得我的过程是拼凑在一起的,没有很好的可扩展性。我可以这样写:

<标题>晚饭观点:
@Url.Action("Create", "Taco", new { From = "Supper" })
<标题>午餐观点:
@Url.Action("Create", "Taco", new { From = "Lunch" })

然后取"From"变量并传递给

Taco Controller>Taco View Model>Taco View>Link Back To From

是否有一个内置的方式来传递参考信息,是否有一个预定义的设计模板MVC来处理这些情况?

实际上就是重用所有东西。例如,您可以只有一个操作和一个视图,并使用URL来确定行为。您所需要的只是一个视图模型,这样表单就可以只使用一种类类型,然后您可以将数据映射到它应该去的任何地方。例如:

[HttpPost]
[ValidateAntiForgeryToken]
[Route("{mealType:regex(supper|lunch)}/create")]
public ActionResult CreateMeal(string mealType, MealViewModel model)
{
    if (ModelState.IsValid)
    {
        switch (mealType)
        {
            case "supper":
                // map data to new `Supper` and save
                break;
            case "lunch":
                // map data to new `Lunch` and save
                break;
        }
        // do redirect
    }
    return View(model);
}

还有其他不使用属性路由的方法来处理这个问题,但一般的想法是,以某种形式或方式指示要保存哪种类型的膳食,并相应地进行分支,创建和保存适当的类。

据我所知,没有预定义的模板。但是如果你想要的话,你可以创建一个EditorTemplate,并在你的剃刀视图中广泛使用。

另外,在路由参数中发送From,你可以在晚餐和午餐类中有一个属性,比如gobackUrl(只是例子),并在创建GET动作中生成gobackUrl,并将其隐藏在形式值中。因此,子动作视图将更加通用你不需要在父视图中有if-else逻辑

最新更新