【问题标题】:ASP.NET MVC, create Views with parameters, error in POST submissionASP.NET MVC,创建带参数的视图,POST提交时出错
【发布时间】:2019-12-02 23:14:46
【问题描述】:

首先,我正在使用 ASP.NET Core 2.1 和 EF Core 2.1 自学 ASP.NET MVC,所以我对此很陌生。

我正在尝试更改创建视图,以接受 ClientID 的可选参数。这个想法是如果没有提供 ID,则允许从所有客户端中进行选择,但如果提供,则强制客户端的表单输入为给定值。

我无法让 GET 识别存在参数,除非该参数专门为 int? id 。如果我把它改成这个,那么当提交给 POST 时,会为重复的 ID 引发异常。

所有的控制器和视图都搭建好了,只有显示的 GET 方法发生了变化。

控制器创建GET方法:

// GET: ServiceRequest/Create/1
public IActionResult Create(int? clientId)
{
    ViewData["ClientData"] = new SelectList(_context.Clients, "ID", "FullName");
    if (clientId != null ) {
        if (_context.Clients.Find(clientId) == null) {
            return NotFound();
        }
        ViewData["ClientID"] = clientId;
        ViewData["ClientName"] = _context.Clients.Find(clientId).FullName;
    }
    ServiceRequest request = new ServiceRequest();
    request.Deadline = DateTime.Today;
    request.Status = Models.Status.DRAFT;
    return View(request);
}

创建视图:

@model AskewServices.Models.ServiceRequest

@{
    ViewData["Title"] = "Open Service Request";
}

<h2>@ViewData["Title"]</h2>

<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Deadline" class="control-label"> </label>
                <input asp-for="Deadline" class="form-control" />
                <span asp-validation-for="Deadline" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Status" class="control-label"></label>
                <select disabled asp-for="Status" class="form-control">
                    <option value=@AskewServices.Models.Status.DRAFT>Draft</option>
                </select>
                <span asp-validation-for="Status" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label class="control-label">Client</label>
                @if (ViewData.ContainsKey("ClientID")) {
                    <select disabled asp-for="ClientID" class="form-control">
                        <option value=@ViewData["ClientID"]>@ViewData["ClientName"]</option>
                    </select>    
                } else {
                    <select asp-for="ClientID" class="form-control" asp-items="ViewBag.ClientData"></select>
                }                
            </div>
            <div class="form-group">
                <input type="submit" value="Open" class="btn btn-warning" />
                <input type="reset" value="Reset" class="btn btn-info" />
            </div>
       </form>
    </div>
</div>

路线:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute(
                name: "OpenServiceRequest",
                template: "{controller=ServiceRequest}/{action=Create}/{clientId?}");
        });

思考:参数没有以正确的方式指定,或者路由有问题(可能看不到 ServiceRequest Create 路由)?

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-mvc


    【解决方案1】:

    我建议你像这样使用 ASP.Net Core 的默认路由配置

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });
    

    所以不需要添加 OpenServiceRequest MapRoute

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多