gpt4 book ai didi

c# - Razor 页面 : Inheritance of a model to add fields during creation

转载 作者:行者123 更新时间:2023-12-04 20:26:47 24 4
gpt4 key购买 nike

这些实体是我试图完成的虚构的等价物(实际上更复杂)。

只有在创建文章(SendToSubscribers 字段)时,我才需要在表单中显示额外的字段,而这些不是实体本身的一部分。

public class Article {
public string Title { get; set }
}

public class ArticleCreateForm : Article {
public bool SendToSubscribers { get; set; }
}

在要创建/更新的 cshtml 中有:
@model Article
...
@if (string.IsNullOrEmpty(Model.Id))
{
<admin-input asp-for="SendToSubscribers" />

不幸的是,这是我得到的错误:

'Article' does not contain a definition for 'SendToSubscribers' and no accessible extension method 'SendToSubscribers' accepting a first argument of type 'Article' could be found (are you missing a using directive or an assembly reference?)



抱歉,如果方法根本不好,我来自 PHP 背景。

我想这不是一个好的解决方案,所以我怎样才能做到这一点?谢谢。

最佳答案

也许您不喜欢它,但通常,最简洁的方法是为不同的 View 创建不同的模型,并使这些模型与您的持久性模型不同。

在这种方法中,您应该 ArticleCreateModel仅具有创建文章所需的那些属性,包括 SendToSubscribers .但它不应该有 Id属性因为 Id View 中不需要。所以这应该是模型:

public class Article
{
public string Id { get; set; }
public string Title { get; set; }
}
public class ArticleCreateModel
{
public string Title { get; set; }
public bool SendToSubscribers { get; set; }
}

然后在 Create ArticleContoller的 Action , 接收 ArticleCreateModel然后要持久化数据,您可以创建一个 Article并在存储中持久化并取决于 SendToSubscribers 的值您还将决定将文章发送给订阅者:
public ActionResult Create(ArticleCreateModel model)
{
if(ModelState.IsValid())
{
ArticleBustinessLogic.Create(ArticleCreateModel model);
return RedirectToAction("Index");

// Or simply
// var article = new Article();
// article.Id = Guid.NewGuid().ToString();
// article.Title = model.Title();
// ArticleRepository.Create(article);
// ArticleSubcription.NotifySubscribers(article);
// return RedirectToAction("Index");
}
return View();
}

在这种方法中, View 的模型应该是 ArticleCreateModel你不需要任何 if陈述:
@model ArticleCreateModel

...

<input asp-for="Title" />
<admin-input asp-for="SendToSubscribers" />

...

备注

正如我之前提到的,这不是唯一的解决方案,但它是最干净的解决方案之一。乍一看,你可能会说它因为不同的 View 和不同的模型而增加了开发开销,但从长远来看,使用这种方法是值得的,因为它使 View 代码、 Controller 代码和业务逻辑代码更干净,没有 if 语句并使应用程序更易于测试和维护。您可能还想使用对象来对象映射器,例如 AutoMapper将 View 模型映射到持久性模型更容易。

关于c# - Razor 页面 : Inheritance of a model to add fields during creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58868753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com