Отправить POST-форму из C # способом MVVM - PullRequest
1 голос
/ 17 июня 2011

Я использую элемент управления WebBrowser для автоматизации управления веб-страницей.Когда я запускаю свое приложение WPF, оно показывает, что веб-страница муравья позволяет мне войти в систему.Затем мое приложение начинает выполнять некоторые автоматизированные задачи, переходя на страницу, заполняя форму и отправляя ее (это POST-форма).Он представляет одну и ту же форму ~ 100 раз с разными значениями.

Сейчас мой код выглядит следующим образом:

void webBrowser1_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    var doc = (HTMLDocument) webBrowser1.Document;
    var form = doc.getElementById("theForm");

    SetValueOfFormInput(doc, "id", Foo.ID);
    SetValueOfFormInput(doc, "item1", Foo.Item1);
    SetValueOfFormInput(doc, "item2", Foo.Item2);
    form.all.item("submit").click();
}

private static void SetValueOfFormInput(HTMLDocument doc, string name, string value)
{
    var item = doc.all.item(name);
    item.setAttribute("value", value);
}

Могу ли я сделать это лучше и я могу сделать это MVVM-способом?

И нет,Я не могу изменить веб-страницу, чтобы упростить управление: - (

Редактировать: В идеале я мог бы сделать это без использования элемента управления WebBrowser. Вход в программуна веб-сайт и выполняет все задачи без необходимости изменения форм на html-страницах

1 Ответ

0 голосов
/ 17 июня 2011

Почему бы не использовать классы WebClient или WebRequest?Для веб-клиента вы можете использовать метод UploadValues, который будет делать именно то, что вы хотите (http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx), и вы также можете просто добавить класс для использования файлов cookie, чтобы ваш логин был «постоянным» (http://stackoverflow.com/questions/1777221/c-using-cookiecontainer-with-webclient-class)

Если вам нравится)чтобы сделать это еще более управляемым моделью, я бы использовал WebRequest (уже имеет cookiecontainer) и имел бы некоторый класс с необходимыми данными, который был бы производным от класса, который может сериализовать все необходимые свойства в простую строку, которую вы бы опубликовали всервер - AFAIK - это то же самое, что и параметры-получатели (param1 = val1¶m2 = val2 & ...), в основном:

class Data : Postable { public string Param1{get;set;} public string Param2{get;set;} ...}
class Postable 
{ 
    public override string ToString() 
    { 
        StringBuilder ret = new StringBuilder();
        foreach(Property p in GetType().GetProperties())
        {
            ret.Append("{0}={1}&", p.Name, p.<GetValue>);
        }
        return ret.ToString();
    } 
}
...