我有一个控制器(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中不需要实体类型作为参数。
答案 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=123
和id
呈现视图。没有网址重定向,网址也不会更改。