我的页面上有一堆文本输入(HTML.TEXTBOX,通过for循环生成),我想读取它们的值并仅在用户修改了这些文本框中的内容时才提交到数据库。
这样做的正确方法是什么? (如果文本框的数量少于100,您认为将整个事物提交到数据库可能更有意义吗?)
另外,一般来说,我如何从文本框中的一堆读取值并提交到数据库?我需要一些使用键值对的东西,其中key是id,值将是文本框中的输入。
答案 0 :(得分:0)
除非您使用JavaScript和hidden
字段来跟踪用户更改,否则无法在不查询数据库的情况下知道哪些字段已被修改,因为Web一般都是ASP。 NET MVC尤其是无国籍。但是,如果循环使用存储在对象中的数据填充其值的字段,则可以将该对象保存在会话变量中以与下一个请求进行比较。
伪示例:
public ActionResult GetFormView()
{
var values = (select relevant information from db and store in a
IQueryable<Dictionary<string, string>> or something similar
where you have a relation between input field id/name and value);
Session["TheInputListValues"] = values;
return View(values); // Your view renders your list of input fields
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveChanges(FormCollection form)
{
var oldValues = (Dictionary<string, string>)Session["TheInputListValues"];
var changedValues = new Dictionary<string, string>();
foreach(string key in form.AllKeys)
{
if(oldValues.ContainsKey(key))
{
if (oldValues[key] != form[key])
{
changedValues(key, form[key]);
}
}
}
SaveToDB(changedValues);
return Redirect("SomeWhereElse"); // PRG is king!
}
我没有测试过这个实现,但是值得一试=)
答案 1 :(得分:0)
我使用jQuery做了类似的事情并且效果很好。将行为附加到文本框,如果数据发生更改,则将其值提交给保存数据的操作。
$(function(){
$("input[type='text']").change(function(){
$.post("/SaveChanges",{id: $(this).attr("id"),value : $(this).attr("text")});
});
});
这可以假设您拥有ID,这是您在每个输入上录制的某种唯一键。
<input id="4576" name="4576"/>
你也可以有一个回调,可以说在这个字段中添加一个类,让他们知道通过将信息更改为绿色或其他东西来保存信息。
查看此内容以获取更多详细信息: http://docs.jquery.com/Ajax/jQuery.post