将枚举值作为参数传递给.net core

时间:2020-06-24 10:11:00

标签: asp.net-core

我有一个控制器(ResponseResourceController),它应该将Index Action作为参数int接收,并且在Index action中-从Tempdata解析枚举值。然后,此操作将重定向到具有这两个参数的另一个操作。

    public class ResponseResourceController : Controller
    {
        public async Task<IActionResult> Index(
            int id)
        {
            var entityType = (EntityType)TempData["EntityType"];
            var exists = await _responseResourceStringUiService.ResponseResourceStringExistsAsync(
                id,
                entityType);
            return RedirectToRoute(!exists ?
                RouteNames.ResponseResourceString_Home_Add :
                RouteNames.ResponseResourceString_Home_Edit,
                new {id, entityType});
        }....
    }

   public class PublicationController : Controller
   {
        public async Task<IActionResult> Index()
        {
            var vm = new PublicationViewModel
            {
                ...
            };
           
            TempData["EntityType"] = InboxEntityType.Publication;
            ........
       }
   

我的问题是-是否有更优雅的方法来实现此目的,而在重定向之后,枚举值不会出现在url中。 我在想例如在此ResponseResourceController中创建thids Enum Type的抽象属性 和另一个控制器PublicationController(以及将要执行的操作)继承它,并使用正确的枚举值覆盖该属性,并且由于ResponseResourceController将具有属性,因此在Add and Edit Action中不需要实体类型作为参数。

2 个答案:

答案 0 :(得分:0)

为什么不直接调用PublicationController并避免创建不必要的重定向?如果是新记录或现有记录,则可以直接在前端进行区分。 如果您想使用这种方法来创建新记录,那么您应该更喜欢使用POST请求而不是GET。

答案 1 :(得分:0)

简而言之,多个控制器不起作用,并且不需要URL重定向。

从描述中,我认为您真正想要的是基于ID(将您的临时实体类型存储在某处)显示添加/编辑表单。如果您要这样做,那么具有多个视图的单个控制器应该可以处理该问题。

创建多个控制器时会发生什么?

应用中的路由规则必须唯一。如果您有一个ResponseResourceController和一个PublicationController,而每个人都有一个Index动作,那么路由会是什么样?

您可能需要为/ResponseResource/Index定义一个像ResponseResourceController.Index()的路由,为/Publication/Index定义一个像PublicationController.Index()的路由。如果有一个名为EntityType的{​​{1}},则可能需要定义一个Bob之类的路由并创建一个/Bob/Index

但是,如果您尝试为每个BobController命名一个唯一的路由,则您的路由必须包含该信息(在路由或查询字符串中)。因此,为每个EntityType创建一个专用控制器无法解决您的问题。

多种实体类型的多个视图

如果您不想在网址中包含EntityType,则可以使用EntityType获取实体ID ,并对不同的ResponseResourceController.Index(int id)用不同的视图进行响应< / strong>:

[Route("/response-resource")]
public class ResponseResourceController : Controller
{
    [HttpGet("")]
    public async Task<IActionResult> Index(int id)
    {
        var entityType = (EntityType)TempData["EntityType"];
        var exists = await _responseResourceStringUiService.ResponseResourceStringExistsAsync(id, entityType);
        var viewName = exists ? "_AddEntity" : "_EditEntity";
        var vm = new GenericViewModel
        {
            type = entityType,
            /* other fields */
        }
        return View(viewName, vm); // so user may see a different view under different situation
    }
}

对于视图模型:

public class GenericViewModel 
{
    public EntityType type { get; set; }
}

您还需要定义2个视图:EntityType_AddEntity。在上面的示例中,_EditEntity包含GenericViewModel,因此您将知道要处理哪个实体。

此外,您甚至可以为每个EntityType定义一个专用视图,并将专用视图模型传递给该视图。例如EntityType将成为PublicationViewModel_AddPublication视图中使用的视图模型。

预期行为

当用户使用和ID请求 ResponseResource 时,例如_EditPublication,您的应用程序将基于/response-resource?id=123id呈现视图。没有网址重定向,网址也不会更改。