GVKun编程网logo

在MVC中处理$ _POST数据的正确方法是什么?(mvc post请求)

5

关于在MVC中处理$_POST数据的正确方法是什么?和mvcpost请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android–离线时在Firestore中添加/更新数据的正确方法

关于在MVC中处理$ _POST数据的正确方法是什么?mvc post请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 离线时在Firestore中添加/更新数据的正确方法是什么?、asp.net-mvc – ASP.NET MVC 3解决方案结构,数据引用和Automapper集成的正确方法是什么?、asp.net-mvc – 从asp.net POST动作方法更新nhibernate实体的正确方法是什么?、asp.net-mvc – 在MVC中处理重复表单的最佳方法是什么?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在MVC中处理$ _POST数据的正确方法是什么?(mvc post请求)

在MVC中处理$ _POST数据的正确方法是什么?(mvc post请求)

在PHP系统中,我有一个常见的MVC情况:ControllerView包含的$_POST数据中接收请求。现在,我有三种方法来处理数据:

a)Controller仅调用ModelModel处理$_POST数据。
b)在Controller变换的$_POST数据转换成变量,并将它们传递到Model
c)Controller$_POST数据转换为Model的域对象,并将该对象仅传递给Model

目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。

因此,根据MVC,处理$_POST数据的正确方法是什么?

编辑 目前,我没有使用任何MVC框架。

编辑2 通常,相同的Controller请求处理浏览器,Web服务,脱机应用程序等的请求,或者每个请求都有它自己的请求Controller

答案1

小编典典

最好的选择是使用 #2 方法,并进行一些更改。
我会这样写:

public function postLogin( $request ){     $service = $this->serviceFactory->build(''Recognition'');     $service->authenticate( $request->getParam(''username''),                             $request->getParam(''password'') );}// Yes, that''s the whole method

如果您已使用Request实例(例如实例)来抽象用户输入,则实际上无需创建变量。

另外,您可能希望Request::getParam()用类似的方法替换该方法Request::getPost()-尽管我得出的结论是,在结构正确的应用程序中,GETand
POST参数不应共享相同的名称。

serviceFactory你的代码片段看到是,你在这两个控制器和视图实例注入的对象。它可以让您在控制器和视图之间共享相同的服务实例。

它负责创建服务
(其中将包含应用程序逻辑,而将域业务逻辑保留在
域对象中)
,这有助于您从表示层隔离域实体和存储抽象之间的交互。

关于其他选项:

  • Controller仅调用Model,而Model处理$ _POST数据。

在MVC和MVC启发的设计模式中,模型应该既不了解用户界面,也不了解整个表示层。在$_POSTPHP中的变量是一个超全局变量。

如果将其用于模型层,则代码将绑定到Web界面,甚至是特定的请求方法。

  • 控制器将$ _POST数据转换为模型的对象,并将该对象仅传递给模型

不能完全确定您的意思。似乎您在谈论抽象的实例化,其中将包含用户的请求。但是在这种情况下,控制器将负责所述结构的实例化/创建,这将违反SRP。

结束语:

您必须了解的一件事是,在基于Web的MVC应用程序的上下文中,应用程序的 用户
是浏览器。不是你。浏览器发送请求,该请求由路由机制处理并由控制器分发。并且view 对您的浏览器 产生响应。

另一件事是:模型既不是类也不是对象。


更新资料

通常,相同的Controller处理来自浏览器,Web服务,脱机应用程序等的请求,或者每个控制器都有自己的Controller?

您应该能够使用一个控制器来处理所有形式的应用程序。但这只是在一定条件下,您实际上在所有3个用例中都使用相同的应用程序。

这样做有两个条件:

  • 您需要抽象该Request控制器接收到的实例
  • 该视图应在控制器外部实例化

这样,您可以使一个应用程序满足所有要求。每个变体都有不同的唯一之处是引导阶段,在该阶段您可以创建Request实例并选择正确的视图。

在您所描述的情况下,变化的部分实际上是视图,因为可以预期REST或SOAP服务将产生与普通Web应用程序不同的响应。

android – 离线时在Firestore中添加/更新数据的正确方法是什么?

android – 离线时在Firestore中添加/更新数据的正确方法是什么?

当我的应用程序处于脱机状态并且我正在添加或更新文档时,内存会增加.此外,显示文档列表需要更长时间才能加载.如果我在设备联机时运行相同的代码,则内存保持一致以及具有文档列表的活动的速度.

我正在进行如下保存:

collectionRef.document(id).set(obj, Setoptions.merge());

或者用于批处理几个记录:

batch.set(docRef1, obj1);
batch.set(docRef2, obj2);
batch.commit();

我有onComplete的听众,但是在this question的接受答案中,它似乎表明在大多数情况下听众是不必要的,并且当你离线时你无法等待它完成.

在另一个问题中,他们在代码中指出需要“快照”才能正确地进行在线和离线保存:Offline issue with Firestore vs Firebase.但我找不到其他任何地方,表明这是否会产生影响.我认为当您想要通知对文档或查询的更改时,将Snapshot作为附加到文档或查询的内容,如果未删除,则附加类似的侦听器将导致内存泄漏.

所有这一切的另一部分是这种缓慢可能会如何影响数据完整性.当我在Android Studio的分析器中观看时,我发现即使我在应用程序中没有做任何事情,FirestoreWorker也可以达到一直持续工作的程度.我不只是说几秒钟,更像是一分钟.我可以找到离线时没有任何写入保证.尝试停止并重新启动应用程序似乎对缓慢没有任何影响(尽管它会重置内存).

所以这一切都导致了一个问题:在离线时在Firestore中添加/更新数据的正确方法是什么,以便应用程序的内存不会无限增长和减速?

解决方法:

Cloud Firestore使用sqlite作为其持久性机制.因此,对于间歇性的离线活动,您不应该遇到性能或耐用性问题.

但是,如果您打算在很长一段时间内使用Firestore数据库,那么您应该注意一些事项. Cloud Firestore不是作为脱机数据库构建的,是一个在线数据库,当您在短时间或更长时间内脱机时,该数据库将继续工作.脱机时,尚未同步到服务器的挂起写入将保留在队列中.如果您在没有联机进行同步的情况下执行过多的写入操作,那么该队列将快速增长,并且不会仅降低写入操作的速度,也会降低读取操作的速度.

所以我建议使用这个数据库来实现其在线功能.正如Firebase的一位工程师所说的那样,“我不可能在Firestore中构建一个慢速查询”.因此,性能来自后端的新索引功能,并且当您处于脱机状态时这些优化不存在.

还有一件事,如果您有许多尝试写入同一文档的脱机客户端,则在更改状态时,实际上只会将最后一个写入服务器.

因此,要回答您的问题,在离线时没有正确的方法在Firestore中添加/更新数据,以减少内存使用量.刚上网就是这样!

asp.net-mvc – ASP.NET MVC 3解决方案结构,数据引用和Automapper集成的正确方法是什么?

asp.net-mvc – ASP.NET MVC 3解决方案结构,数据引用和Automapper集成的正确方法是什么?

我已经创建了一个ASP.NET MVC 3解决方案.它由三个独立的项目组成.我将使用Automapper和Unity.每个View都有自己的viewmodel.

这些项目是:

> DATA(代码优先模型和存储库类位于此项目中)
> BUSInesS(服务类位于此项目中.添加DATA项目作为参考.)
> WEB(WEB UI项目.这是MVC项目.添加了BUSInesS项目作为参考.)

现在,我有2个问题.

>这个项目结构是一个好习惯吗?
>我正在尝试将Automapper与我在控制器中的服务调用一起使用.但是,如果我在控制器中使用Automapper,我必须在我的WEB项目中添加DATA项目作为参考,以便从POCO转换到viewmodel. WEB项目不应该只与BUSInesS项目交互吗?

需要帮助.

谢谢.

解决方法

问题1这是主观的,这不是最好的问题.但是,对于它的价值,我维护的项目通常在其中包含Core,Web和Services项目.

问题2不,根据您的示例和我的经验,您的Web项目可以引用您的DATA和BUSInesS项目.对我们来说,我们的Web项目了解我们的核心和服务项目.但是,我们的服务项目没有引用我们的Web项目.出于这个原因,我们的Automapper配置确实知道如何映射到服务模型,视图模型和实体模型.

这有帮助吗?如果您愿意我详细说明,请在评论中告诉我.从on this blog开始,您可以找到一个描述与我们使用的类似项目设置的图像.

asp.net-mvc – 从asp.net POST动作方法更新nhibernate实体的正确方法是什么?

asp.net-mvc – 从asp.net POST动作方法更新nhibernate实体的正确方法是什么?

我是nHibernate的新手,并试图通过正确的方式从Web应用程序表单POST更新分离的对象. (我们使用的是ASP.NET MVC)

我正在尝试更新的对象包含(除其他外)IList的子对象,映射的内容如下:

<bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
      <key column="JobNumber" />
      <one-to-many/>
</bag>

我们已经安排了我们的MVC编辑视图表单,以便当它被回发时,我们的操作方法被传递给对象(包括子项的List<>)我们通过表单正确地往返所有实体ID.

我们对post动作方法的天真尝试执行session.SaveOrUpdate(parentObject),其中parentObject已被默认的modelbinder从视图窗体中删除.

对于以下任何一种情况,这似乎都可以正常工作:

>创建新的父对象
>修改父级的属性
>添加新的子对象
>修改现有子对象
(查看nHibernate日志,我可以看到它正确建立对象是新的还是现有的,并发出适当的UPDATE或INSERT)

失败的情况是:
– 删除子对象 – 即如果它们不在IList中,则不会从数据库中删除它们.没有例外或任何事情,他们只是不被删除.

我的理解是,这是因为nHibernate为创建需要删除的子列表而执行的魔法不适用于分离的实例.

我无法找到一个简单的例子,说明使用nHibernate这种行为方法应该是什么样的(即使用模型绑定器对象作为分离的nHibernate实例) – 基于MS EF的示例(例如http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx)似乎使用了方法’ApplyPropertyChanges’将已更改的属性从模型绑定对象复制到重新加载的实体实例.

所以,经过这一切,问题很简单 – 如果我有模型绑定器给我一个包含子对象集合的新对象,我应该如何通过nHibernate更新它(其中’update’包括可能删除子节点)?

解决方法

这是一个我认为你想做的事情的例子.如果我误解了你想要做的事,请告诉我.

鉴于以下“域”类:

public class Person
{
    private IList<Pet> pets;

    protected Person()
    { }

    public Person(string name)
    {
        Name = name;
        pets = new List<Pet>();
    }

    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IEnumerable<Pet> Pets
    {
        get { return pets; }
    }

    public virtual void AddPet(Pet pet)
    {
        pets.Add(pet);
    }

    public virtual void RemovePet(Pet pet)
    {
        pets.Remove(pet);
    }
}

public class Pet
{
    protected Pet()
    { }

    public Pet(string name)
    {
        Name = name;
    }

    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}

使用以下映射:

public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {
            LazyLoad();
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
            HasMany(x => x.Pets)
                   .Cascade.AllDeleteOrphan()
                   .Access.AsLowerCaseField()
                   .SetAttribute("lazy","false");
        }
    }

    public class PetMap : ClassMap<Pet>
    {
        public PetMap()
        {
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
        }
    }

这个测试:

[Test]
    public void CanDeleteChildren()
    {
        Person person = new Person("joe");

        Pet dog = new Pet("dog");
        Pet cat = new Pet("cat");

        person.AddPet(dog);
        person.AddPet(cat);

        Repository.Save(person);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        Person retrievedPerson = Repository.Get<Person>(person.Id);
        Repository.evict(retrievedPerson);

        retrievedPerson.Name = "evicted";

        Assert.AreEqual(2,retrievedPerson.Pets.Count());
        retrievedPerson.RemovePet(retrievedPerson.Pets.First());

        Assert.AreEqual(1,retrievedPerson.Pets.Count());

        Repository.Save(retrievedPerson);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        retrievedPerson = Repository.Get<Person>(person.Id);
        Assert.AreEqual(1,retrievedPerson.Pets.Count());
    }

运行并生成以下sql:

DeletingChildrenOfevictedobject.CanDeleteChildren:已通过
NHibernate:INSERT INTO [Person](Name,Id)VALUES(@ p0,@ p1); @ p0 =’joe’,@ p1 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′

NHibernate:INSERT INTO [Pet](Name,@ p1); @ p0 =’dog’,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’

NHibernate:INSERT INTO [Pet](Name,@ p1); @ p0 =’cat’,@ p1 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’

NHibernate:UPDATE [Pet] SET Person_id = @ p0 WHERE Id = @ p1; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’

NHibernate:UPDATE [Pet] SET Person_id = @ p0 WHERE Id = @ p1; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′,@ p1 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’

NHibernate:SELECT person0_.Id as Id5_0_,person0_.Name as Name5_0_ FROM [Person] person0_ WHERE person0_.Id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′

NHibernate:SELECT pets0_.Person_id as Person3_1_,pets0_.Id as Id1_,pets0_.Id as Id6_0_,pets0_.Name as Name6_0_ FROM [Pet] pets0_ WHERE pets0_.Person_id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′

NHibernate:UPDATE [Person] SET Name = @ p0 WHERE Id = @ p1; @ p0 =’被驱逐’,@ p1 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′

NHibernate:UPDATE [Pet] SET Name = @ p0 WHERE Id = @ p1; @ p0 =’dog’,@ p1 =’464e59c7-74d0-4317-9c22-9bf801013abb’
NHibernate:UPDATE [Pet] SET Person_id = null WHERE Person_id = @ p0 AND Id = @ p1; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′,@ p1 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’

NHibernate:DELETE FROM [Pet] WHERE Id = @ p0; @ p0 =’010c2fd9-59c4-4e66-94fb-9bf801013abb’

NHibernate:SELECT person0_.Id as Id5_0_,pets0_.Name as Name6_0_ FROM [Pet] pets0_ WHERE pets0_.Person_id=@p0; @ p0 =’cd123fc8-6163-42a5-aeeb-9bf801013ab2′

注意DELETE FROM [Pet] ……

所以,你需要能够做的是手工操作一个Person对象(在这个例子中)与修改后的集合,它应该能够确定要删除的内容.确保设置了Cascade.AllDeleteOrphan()属性.

asp.net-mvc – 在MVC中处理重复表单的最佳方法是什么?

asp.net-mvc – 在MVC中处理重复表单的最佳方法是什么?

我能想到的最好的公共示例是亚马逊购物车.您有一个页面显示多个不同的记录,可以更新多个不同的字段.

我不能把每个都放在一个表单标签中,因为用户可能会修改多个记录然后提交.

我不能只更新我收到的所有记录,因为:
  1.表现
  2.审计
  3.如果有人在查看页面时更改了用户“未更改”的记录,则用户提交这些更改将被覆盖.

那么如何最好地处理数据,然后获取更改的记录?

明白了吗?

解决方法

使用绑定!不要在您的操作中迭代表单集合.

史蒂夫桑德森写了一篇关于如何做到这一点的blog post.我在MvcContrib.FluentHtml上写了一篇关于如何做到这一点的blog post.这两篇文章都非常详细,包括可下载的代码.

今天关于在MVC中处理$ _POST数据的正确方法是什么?mvc post请求的分享就到这里,希望大家有所收获,若想了解更多关于android – 离线时在Firestore中添加/更新数据的正确方法是什么?、asp.net-mvc – ASP.NET MVC 3解决方案结构,数据引用和Automapper集成的正确方法是什么?、asp.net-mvc – 从asp.net POST动作方法更新nhibernate实体的正确方法是什么?、asp.net-mvc – 在MVC中处理重复表单的最佳方法是什么?等相关知识,可以在本站进行查询。

本文标签: