为了防止用户在往返(从调用HttpGet处理到HttpPost处理操作方法)之间篡改任何id(例如:CustomerId,UserId,ProductId等),我想使用TempData[].
但是,大多数人使用隐藏字段来跟踪ID.但我认为用户仍然可以篡改它们.
简而言之,
TempData["id"]比使用隐藏字段更安全地跟踪往返HttpGet和HttpPost之间的ID?TempData[]吗?在这种情况下,我TempData[]仅用于跟踪ID,而不用于其他字段.其他字段仍然向用户公开.
我有 2 个控制器:AliceController和BobController. 每个都包含Index操作方法。视图模型很简单,如下所示:
class Foo{[Required]public int data{get;set;}}
Run Code Online (Sandbox Code Playgroud)
如何将强类型对象从 Alice 传递给 Bob?
class AlliceController: Controller
{
[HttpPost]
public ActionResult Index(Foo foo)
{
if(ModelState.IsValid)
{
// I want to pass foo to Bob's Index. How to do it?
return RedirectToAction("Index","Bob");
}
else return View();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个域模型和一个视图模型如下:
领域模型:
namespace MvcApplication1.Models
{
public enum Sex { Male, Female };
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
[Required(ErrorMessage="Please select either Female or Male.")]
public Sex? Sex { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
查看型号:
namespace MvcApplication1.ViewModels
{
public class HomeCreateVM
{
public HomeCreateVM()
{
}
public HomeCreateVM(Person p)
{
Person = p;
SelectList = p.Sex.GetSelectList();
}
public Person Person { get; set; }
public SelectList SelectList { get; …Run Code Online (Sandbox Code Playgroud) Model == null ?
new SelectList(genders, "Value", "Text") :
new SelectList(genders, "Value", "Text", Model);
Run Code Online (Sandbox Code Playgroud)
我想避免写new SelectList(genders, "Value", "Text"两次,是否可能?
在Details,Edit,Delete操作方法,我们有id参数,从数据库中检索相应的记录.
如果没有记录对应id,我们有两个选择:
执行操作方法返回一个特定视图,通常命名为 目录
NoFound.cshtml下Views\Shared,以通知用户该 视图id无效.
要么
执行操作方法将用户重定向到特定的操作方法,例如
public ActionResult NoFound (string message),以通知用户该问题.
我的问题是:当没有与给定id关联的记录时,action方法应该执行哪些操作?返回NoFound视图还是重定向到NoFound动作方法?
编辑1 我需要从技术角度出发的理由,例如安全性和性能.