如何将外键从一个视图传递到另一个视图?

Posted

技术标签:

【中文标题】如何将外键从一个视图传递到另一个视图?【英文标题】:How does one pass foreign key from one view to another? 【发布时间】:2021-09-04 12:44:03 【问题描述】:

我对 .NET 和 MVC 还很陌生,我正在尝试找出模型关系。 我有 2 个模型,用于预订研讨会。

namespace App.Models
    public class PreBook
        [Key]
        public int IdPreBookget; set;
        [DataType(DataType.Date)]
        public DateTime Date  get; set; 
        public string  Name  get; set; 
        public string Surname  get; set; 
        public string Adress  get; set; 
        public string Email  get; set; 
        public string PhoneNum  get; set; 
        [ForeignKey("Seminar")]
        public int IdSeminar  get; set; 
        public Seminar Seminar get;set;
    

.

namespace App.Models
    public class Seminar
        [Key]
        public int IdSeminar get; set;
        public string Name get;set;
        public string Description get;set;
        [DataType(DataType.Date)]
        public DateTime Date get; set; 
        public bool Filled  get; set; 
        public List<Predbiljezba> Predbiljezbe get; set;
    

我的索引视图列出了所有未满/未满的研讨会。 Index view

@model IQueryable<Seminar>

<div class="container p-3">
    <div class="row pt-4">
        <form asp-action="Index" method="get">
            <div class="form-actions no-color">
                <p>
                    <b>Search:</b> <input type="text" name="SearchString" value="@ViewData["CurrentFilter"]" />
                    <input type="submit" value="Search" class="btn btn-default" /> |
                    <a asp-action="Index">Back to Full List</a>
                </p>
            </div>
        </form>
    </div>
 @if(Model.Count() > 0)
    <table class="table table-bordered table-striped" style="width:100%">
        <thead>
            <tr>
                <th>
                    
                </th>
                <th>
                    Name
                </th>
                <th>
                    Description
                </th>
                <th>
                    Date
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            
                if(!item.Filled)
                    <tr>
                    <td class="text-center">
                        <a asp-controller="PreBook" asp-route-Id="@item.IdSeminar" asp-action="PreBook">Choose</a>
                    </td>
                    <td >@item.Naziv</td>
                    <td >@item.Opis</td>
                    <td >@item.Datum</td>
                    <!----<td ></td>---->

                </tr>
                
            
        </tbody>
    </table>
else
    <p>No category exists.</p>

这是我在点击“选择”时调用的 Prebook 操作,这是我需要帮助的地方。

public IActionResult PreBook()
    ViewData["IdSeminara"] = new SelectList(_context.Seminars, "IdSeminar", "Naziv");
    return View();

这是后期操作:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PreBook(PreBook obj)

    if (ModelState.IsValid)
    
        _context.PreBooks.Add(obj);
        _context.SaveChanges();
        return RedirectToAction("Index");
    
    else
    
        return View(obj);
    

这是预购视图。 PreBook View

及其代码:

@model PreBook


<form method="post" asp-action="PreBook">
    <div class="border p-3">
        <div asp-validation-summery="ModelOnly" class="text-danger"></div>
        <p></p>
        <h4>I want to display chosen seminar name here</h4>
        <div class="row">
            <div class="col-8">
                <div class="form-group row">
                    <div class="col-4">
                        <b>Name:</b>
                    </div>
                    <div class="col-8">
                        <input asp-for="Name" class="form-control" />
                        <span asp-validation-for="Name" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <b>Surname:</b>
                    </div>
                    <div class="col-8">
                        <input asp-for="Surname" class="form-controll" />
                        <span asp-validation-for="Surname" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <b>Adress:</b>
                    </div>
                    <div class="col-8">
                        <input asp-for="Adress" class="form-controll" />
                        <span asp-validation-for="Adress" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <b>Email:</b>
                    </div>
                    <div class="col-8">
                        <input asp-for="Email" class="form-controll" />
                        <span asp-validation-for="Email" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-4">
                        <b>Phonenumber:</b>
                    </div>
                    <div class="col-8">
                        <input asp-for="PhoneNum" class="form-controll" />
                        <span asp-validation-for="PhoneNum" class="text-danger"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <input type="submit" value="Confirm" class="btn btn-primary" />
                </div>
            </div>
            <div class="col-4">
                @*Keep this empty*@
            </div>
        </div>
    </div>

那么,当我选择要预订的研讨会时,如何将其密钥发送到 PreBook 视图并将其作为 PreBook 模型中的外键保存到数据库? (我还想在 PreBook 视图中显示所选的研讨会名称)。我一直在寻找这一天,但我没有找到任何明确的解释。

dotnet 和 ef 都是 5.0

【问题讨论】:

@GertArnold 都是 5.0,刚加进去。 什么是 prebiljizba 模型字段?另请在帖子中显示 prebiljizba 操作方法 @Harkiratsingh 哦,对不起,我正在将我的代码翻译成英文以便更好地理解,忘记翻译那部分,它基本上是 PreBook 【参考方案1】:

试试这个,应该可以的

[Route("Prebook/Prebook/id")]
public IActionResult PreBook(int Id)
//Get name of seminar from id
string seminarName=_context.Seminars.Where(x=>x.Id==Id).FirstOrDefault().Name;
Seminar sem=new Seminar()Name=seminarName,Id=Id);
Prebook pre=new Preebook()Seminar=sem,IdSeminar=Id
return View(pre);

在视图中您可以使用以下代码

               <div class="col-8">
                    <input type="hidden" value="IdSeminar" name="idSeminar"/>
                    <input asp-for="Seminar.Name" class="form-control" />
                    <span asp-validation-for="Seminar.Name" class="text-danger"> 
                    </span>
                </div>

还将异常处理应用于预售书插入。

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PreBook(PreBook obj)
 
 if (ModelState.IsValid)
 
      obj.Seminar=null;
  try
    _context.PreBooks.Add(obj);
    _context.SaveChanges();
   
catch(Exception ex)
 
 Debug.Write(ex.Message);
 
    return RedirectToAction("Index");

else

    return View(obj);


【讨论】:

如何在视图中显示选定的研讨会名称,然后在单击确认按钮时保存外键(调用 post 方法)。 如果对你有用,请接受答案 视图是否正确更新为研讨会名称?尝试调试它现在还远远不够 是的,但是当点击确认时,我在 PreBooks 表中什么也没有。 检查模型状态是否有效?

以上是关于如何将外键从一个视图传递到另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

ajax调用时如何将外键传递给json数据?

如何将tabpanel的键从视图传递到控制器asp mvc

Django如何将外键传递给ModelForm字段

通过 post 将外键的 id 传递给表单

如何将触摸事件从一个视图传递到另一个视图

如何轻松地将变量从一个视图传递到另一个视图?