gpt4 book ai didi

c# - 未从 UI 调用函数时用户为空

转载 作者:行者123 更新时间:2023-11-30 15:22:49 26 4
gpt4 key购买 nike

在我的数据库表中,我有一列,其中的值在保存到数据库之前进行了操作。在向表中插入大量值之后,在开发的后期添加了操作逻辑。现在我想编辑表的内容来操作现有内容的值。

我的方法

为表中的所有项目调用编辑功能,因为在 EDIT 操作方法中也添加了操作逻辑。

当我在循环遍历数据库中的内容时调用编辑函数时,我得到一个空引用异常,当我从 UI 使用编辑函数时,它不存在。

编辑操作方法

    public ActionResult Edit([Bind(Include = "SetValueID,Value,Status,TcSetID,OptionValueID,CreatedOn,CreatedBy,ModifiedOn,ModifiedBy")] SetValue setValue)
{
//Many lines removed for simplicity. all the variables used in the code are assigned.
if (ModelState.IsValid)
{
// Valuestring from another function

setValue.Value = valuestring;
var original = db.SetValue.Find(setValue.SetValueID);
bool modified = original.Value != setValue.Value;
if (modified)
{
var rev = new RevisionHistory();
rev.CreatedOn = original.ModifiedOn;
rev.ModifiedBy = User.Identity.Name; //If modified exception on this line
db.Entry(original).CurrentValues.SetValues(setValue);
db.RevisionHistory.Add(rev);
}
original.ModifiedOn = DateTime.Now;
original.ModifiedBy = User.Identity.Name; //if not modified exception on this line
db.Entry(original).State = EntityState.Modified;
db.SaveChanges();
}
}

此函数的调用是从 HomeController 进行的。我在从 HomeController 调用 EDIT 方法时注释了所有返回语句。

异常

Object reference not set to an instance of an object.

问题

为什么从 UI 调用时编辑工作正常,没有任何异常,而不是从 HomeController 调用?

为什么即使我从不同的 Controller 调用该函数,用户仍为 null?使用 Windows 身份验证。如果用户已通过身份验证,如何获取用户名?

EDIT - 添加了调用 Edit 函数的方式

    //Home controller (But I have also tried calling the function from a different controller where the call to the method is from the UI
public ActionResult Index()
{
test();
return View();
}

public void test()
{
foreach(var item in db.SetValue.ToList())
{
var setvalcon = new SetValuesController();
setvalcon.Edit(item);

}
}

更新 - 问题的一般概述

可以概括这个问题,以便找到使用 Windows 身份验证时如何定义用户属性的答案。

Controller 是否只有在从 UI 调用时才能访问 Windows 用户属性?

是否无法在不通过 UI 调用的函数中访问用户属性?

据我所知,关于这个问题最好的一点是,用户是在调用 test 方法的 Controller 中定义的,而不是在 Edit 中定义的在另一个 Controller 中。

最佳答案

当您说只能从 UI 访问 User 属性时,您是部分正确的。正确答案是 -

当通过 UI 访问 Edit 方法时,它实际上是通过 ASP.Net Controller 初始化程序管道,该环境负责当前浏览器 session 并分配 User变量。 HttpContext 此时可用。

但是当你像这样创建 Controller 变量时 -

var setvalcon = new SetValuesController();
setvalcon.Edit(item);

您正在绕过所有这些初始化代码。没有 HttpContext,这只是另一个普通对象,因此它没有填充 User 属性。

问题回答:

  1. Controller 是否只有在从 UI 调用时才能访问 Windows 用户属性?

=> 是的,完全正确,因为您正在通过 ASP.Net 管道。但这不仅适用于 Windows 用户,所有这些都在 HttpContext 中。

  1. 是否无法在不通过 UI 调用的函数中访问用户属性?

=> 仅当您手动分配它,否则否。

更多见解:

基本上,您要实现的是一个非常糟糕的设计。无处,记住无处,你应该从 Controller 内部调用 Controller ,除非它是基方法调用的子类。从另一个 Controller 内部调用另一个 Controller 的唯一方法是使用“重定向”方法重定向执行。没有人会阻止你像这样调用 Controller ,但这表明设计原则很差..

解决您的情况的最佳方法是这样的-

public class ModelService {
public void Edit(IPrincipal user, SetValue setValue){
setValue.Value = valuestring;
var original = db.SetValue.Find(setValue.SetValueID);
bool modified = original.Value != setValue.Value;
if (modified)
{
var rev = new RevisionHistory();
rev.CreatedOn = original.ModifiedOn;
rev.ModifiedBy = User.Identity.Name; //If modified exception on this line
db.Entry(original).CurrentValues.SetValues(setValue);
db.RevisionHistory.Add(rev);
}
original.ModifiedOn = DateTime.Now;
original.ModifiedBy = User.Identity.Name; //if not modified exception on this line
db.Entry(original).State = EntityState.Modified;
db.SaveChanges();
}
}

然后在两个 Controller 的构造函数中 -

public class ControllerOne : Controller {
private readonly ModelService _modelService
//constructor
public ControllerOne(){
_modelService= new ModelService ();
}

public ActionResult Edit([Bind(Include = "SetValueID,Value,Status,TcSetID,OptionValueID,CreatedOn,CreatedBy,ModifiedOn,ModifiedBy")] SetValue setValue)
{
//Many lines removed for simplicity. all the variables used in the code are assigned.
if (ModelState.IsValid)
{
_modelService.Edit(User, Setvalue);
}
}

//controller 2
public class HomeController: Controller {
private readonly ModelService _modelService
//constructor
public ControllerOne(){
_modelService= new ModelService ();
}

public ActionResult Index()
{
foreach(var item in db.SetValue.ToList())
{
_modelService.Edit(User, item);
}
}
}

您可以借助 IoC Container 进行依赖注入(inject),这是更好的方法。

关于c# - 未从 UI 调用函数时用户为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35196188/

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