【问题标题】:.NET Core 3.1: pass value from cshtml page input form field to controller.NET Core 3.1:将值从 cshtml 页面输入表单字段传递到控制器
【发布时间】:2020-10-02 03:43:34
【问题描述】:

我正在寻找一种将值从 Razor 页面传递到控制器的方法。

这些是我的模型:

public class DocumentModel
{
    public int Id { get; set; }

    [Display(Name = "Titolo")]
    [Required, MinLength(3)]
    public string Title { get; set; }
    [Range(1, int.MaxValue)]
    [Display(Name = "Versione Attiva")]
    public int ActiveVersion { get; set; }
    [Range(1, int.MaxValue)]

    [Display(Name = "Ultima Versione")]
    public int LastVersion { get; set; }

    public virtual ICollection<DocumentVersionModel> DocumentVersion { get; set; }
}

public class DocumentVersionModel
{
    public int Id { get; set; }
    public int DocumentModelId { get; set; }
    [DataType(DataType.Date, ErrorMessage="Date only")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime CreationDate { get; set; }
    [DataType(DataType.Date, ErrorMessage="Date only")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime LastChangeDate { get; set; }
    [DataType(DataType.Date, ErrorMessage="Date only")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime DocumentDate { get; set; }
    public string Content { get; set; }
    public int Version { get; set; }
    public DocumentModel Document { get; set; }
}

这是我的 Create.cshtml 页面中的表单:

<form asp-action="Create">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label>Titolo</label>
            <input asp-for="Title" class="form-control" />
            <span asp-validation-for="Title" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label>Data del Documento</label>
            <input asp-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).DocumentDate" class="form-control"/>
            <span asp-validation-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).DocumentDate" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label>Versione</label>
            <input asp-for="ActiveVersion" class="form-control" value="1" readonly="readonly"/>
            <span asp-validation-for="ActiveVersion" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label>Ultima Versione</label>
            <input asp-for="LastVersion" class="form-control" value="1" readonly="readonly"/>
            <span asp-validation-for="LastVersion" class="text-danger"></span>
        </div>
        <div class="form-group">
            <input type="submit" value="Salva" class="btn btn-primary" />
        </div>
</form>

这是我的 Edit.cshtml 页面中的表单:

<form asp-action="Edit">
<div class="row">
    <a class="btn btn-blue-grey" href="/DocumentView">Torna ai documenti</a>
</div>
<br />
<div class="row justify-content-center">
    <div class="col-12 form-group">
        <label>Titolo</label>
        <input asp-for="Title" class="form-control" />
    </div>
    <div class="col">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <input type="hidden" asp-for="Id" id="iddoc" />
        <div class="form-group">
            <label>Data Documento</label>
            <input asp-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).DocumentDate" class="form-control" />
            <span asp-validation-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).DocumentDate" class="text-danger"></span>
        </div>
//PROBLEM HERE: the DocumentDate value is the today date instead of the chosen date in the input form of the Create.cshtml page
        <div class="form-group">
            <label>Data Creazione</label>
            <input asp-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).CreationDate" class="form-control" readonly="readonly" />
        </div>
        <div class="form-group">
            <label>Data Ultima Modifica</label>
            <input asp-for="DocumentVersion.FirstOrDefault(q => q.Version==Model.ActiveVersion).LastChangeDate" class="form-control" readonly="readonly" />
        </div>
    </div>
    <div class="col">
        <div class="form-group">
            <label>Ultima versione</label>
            <input asp-for="LastVersion" class="form-control" readonly="readonly" />
        </div>
        <div class="form-group">
            <label>Versione attiva</label>
            @Html.DropDownList("ActiveVersion", ViewBag.versionlist as SelectList, new { id = "ActiveVersionSave", @class = "form-control" })
        </div>
        <div class="form-group">
            <label>Versione selezionata</label>
            @Html.DropDownList("donotuse", ViewBag.versionlist as SelectList, new { id = "ActiveVersionSelect", @class = "form-control" })
        </div>
    </div>
</div>

这是我的控制器的两种方法:

// POST: DocumentView/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(DocumentModel documentModel)
{
    if (ModelState.IsValid)
    {
        _context.Add(documentModel);
        await _context.SaveChangesAsync().ConfigureAwait(false);
        var documentId = documentModel.Id;
        return RedirectToAction("edit", new { documentid = documentId });
    }
    return View(documentModel);
}

// GET: DocumentView/Edit/5
public async Task<IActionResult> Edit([FromQuery] int documentid)
{
var wtf = await _context.DocumentModel.Include(e => e.DocumentVersion).AsNoTracking().ToListAsync().ConfigureAwait(false);
    var documentModel = await _context.DocumentModel.Include(e=>e.DocumentVersion).Where(i=>i.Id==documentid).FirstOrDefaultAsync().ConfigureAwait(false);
    if (documentModel.DocumentVersion.Count == 0) 
    {
        documentModel.DocumentVersion.Add(await AddVersion(documentModel, 1).ConfigureAwait(false));
        var versionlist = documentModel.DocumentVersion.ToList();
        ViewBag.versionlist =new SelectList(versionlist,"Version","Version");
    }
    else
    {
        var versionlist = documentModel.DocumentVersion.ToList();
        ViewBag.versionlist =new SelectList(versionlist,"Version","Version");

    }
    return View(documentModel);
}

这是编辑调用的 AddVersion 函数:问题仍然存在,因为 DocumentDate 现在设置为 DateTime:

private async Task<DocumentVersionModel> AddVersion(DocumentModel doc, int versionnumber)
    {
        var version = new DocumentVersionModel
        {
            DocumentModelId = doc.Id,
            Version = versionnumber,
            CreationDate = DateTime.Now,
            Document = doc,
            DocumentDate = DateTime.Now,
            LastChangeDate = DateTime.Now
        };
        await _context.DocumentVersionModel.AddAsync(version).ConfigureAwait(false);
        await _context.SaveChangesAsync().ConfigureAwait(false);
        return version;
    }

我想保存“Data del Documento”的值,使其出现在 Edit.cshtml 页面中。

注意:我对 C# 和 MVC 比较陌生,这里编写的大部分代码都不是我编写的,而是由我的舞台主管分配给我的,所以如果可能的话,不要只是向我扔一些代码: )

【问题讨论】:

  • 为什么要让用户输入文档版本?当然,这是 C# 代码或数据库会自动管理的东西——例如在创建时将版本号设置为 1,并在每次编辑文档时增加它?
  • @ADyson 用户无法更改版本,该字段是只读的。用户有两个按钮:“保存在这个版本中”和“另存为新版本”...
  • 好的,那么也许我还没有理解整个场景,但据我所知,我会说服务器可以根据用户选择的按钮(并基于该文档已经存在的版本(如果有)。您不需要上传它(无论如何,这只会为恶意更改它并发送不适当/无效值留下空间 - 仅仅因为该字段设置为只读并不意味着它不能被某人更改有一点知识)。
  • @ADyson 我没有收到有关版本行为的说明,所以我不会碰它,这里的主要问题是我不知道如何将日期从 Razor 页面传递到控制器^^
  • 对不起,也许我误解了?用户是否应该在创建页面上输入版本号?你问的是这个吗?因为如果视图中有一个只读字段,那么唯一的任务就是将值从控制器发送到视图,而不是反过来。您无需再次将其发回,因为它无法更改。如果在提交表单时需要再次知道当前版本号,则应从数据库中查找

标签: c# model-view-controller .net-core razor-pages


【解决方案1】:

解决方案:我修改了 DocumentModel: 并添加了

[DataType(DataType.Date, ErrorMessage = "Date only")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime DocumentDate { get; set; }

Create.cshtml 中的表单现在是:

<div class="form-group">
            <label>Data del Documento</label>
            <input asp-for="DocumentDate" class="form-control" />
            <span asp-validation-for="DocumentDate" class="text-danger"></span>
</div>

现在的 AddVersion 函数是:

var version = new DocumentVersionModel
        {
            DocumentModelId = doc.Id,
            Version = versionnumber,
            CreationDate = DateTime.Now,
            Document = doc,
            DocumentDate = doc.DocumentDate,
            LastChangeDate = DateTime.Now
        };

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2016-01-28
    • 1970-01-01
    • 2012-11-16
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多